你好, 世界 <!--EndFragment--> <!--EndFragment--> <!--EndFragment--> <!--EndFragment--> <!--EndFragment--> <!--EndFragment--> <!--EndFragment--> 【寫在開頭:】 『關 ...
你好, 世界
----------------------------
--1-- Xcode創建OC項目1.1 OC命令行項目--2-- NSLog函數和@符號2.1 NSLog的介紹2.2 NSLog使用方法2.3 NS首碼的含義2.4 @符號--3-- OC和C差異學習3.1 源文件對比3.2 基本語法對比3.3 OC新增的數據類型介紹3.4 OC中的新增異常捕獲方法--4-- 面向對象4.1 編程的實質4.2 面向對象的基本概念--5-- 類和對象5.1 類和對象5.2 類的聲明和實現5.3 對象的存儲細節
----------------------------
【寫在開頭:】
『關於hello, world的由來,在C語言的博客中已經說了,在此,同樣是使用這句話,來向iOS的學習之路開一個頭。
蘋果於2014年6月發表了swift。2015年6月8日,在WWDC2015上宣佈,Swift將開放源代碼,包括編譯器和標準庫。
但其Cocoa和Cocoa Touch等框架及現在很多公司的iOS程式還是以OC編寫的所以,學習OC是必要的。
註意:
OC並不是一門全新的語言
OC完全相容C語言
可以在OC代碼中混入C語言代碼,甚至是C++代碼
可以使用OC開發Mac OS X平臺和ios平臺的應用程式
Objective-C,通常寫作ObjC或OC,較少用Objective C或Obj-C,是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。
Objective-C是面向對象的語言
由布萊德·考克斯(Brad Cox)基於Smalltalk改進而來 遵從ANSI C標準C語法,同時使用了Smalltalk的方法,在運行時可以靈活處理所有情,運行時(runtime)非常靈活:
Dynamic Binding 動態綁定
Dynamic Typing 動態檢查
Dynamic Linking 動態鏈接
』
--1-- Xcode創建OC項目
1.1 OC命令行項目
使用Xcode快速創建項目:
1)選擇項目類型
2)填寫相應的項目信息
創建完成-->
--2-- NSLog函數和@符號
2.1 NSLog的介紹
NSLog是cocoa的框架中提供的一個函數
NSLog的定義
NSLog定義在NSObjcRuntime.h中
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
實際上,NSLog很像printf,同樣會在console中輸出顯示結果,不同的是,傳遞進去的格式化字元是NSString的對象,而不是char *這樣的字元串指針
NSLog和printf使用的差異
1)NSLog 會自動換行 ,而printf不會自動換行
2)NSLog會自動輸出時間等項目信息(日誌形式),而pritnf不會輸出調試信息
3)NSLog函數的參數是一個NSString對象,printf是一個字元串指針
2.2 NSLog使用方法
int a = 5; float f1 = 2.3f; double d1 = 3.14; char ch = 'X'; char *str = "hello"; //能夠運行,說明OC向下相容C printf("%d,%.2f,%.2f,%c\n", a,f1, d1, ch); printf("%s\n", str); printf("----------------\n"); //NSLog格式化輸出 NSLog(@"%d,%.2f,%.2f,%c", a,f1, d1, ch); //str是用字元串指針定義的,所以這裡可以用%s格式化輸出,但如果是NSString,則不能這樣格式化輸出字元串 NSLog(@"--->%s", str); printf("----------------\n"); //OC中自己特有的字元串表示方法 NSString *str1 = @"聽雨"; //NSLog(@"%s", str1); //不能使用%s輸出 NSLog(@"%@", str1); //正確輸出 //使用printf能夠列印str1嗎? //pritnf("-->%@\n", str1); //不能,NSString是OC特有的C不支持
2.3 NS首碼的含義
NSArray,NSString等NS首碼的類、函數歸屬於cocoa Fundation基礎類庫,其"NS”的由來據說是這樣的:喬布斯被蘋果開除後,創立了NeSt公司,而cocoa Fundation基礎類庫就是出自於NeST公司,NeST中的"NS"被作為Fundation中所有成員的首碼。
2.4 @符號
在OC中"@"符號有特殊的用途
1)@""; 這個符號表示將一個C的字元串轉化為OC中的字元串對象NSString
2)@標識符 OC中大部分的關鍵字都是以@開頭的,比如@interface,@imlementation,@end,@class等。
--3-- OC和C差異學習
3.1 源文件對比
C語言中常見的尾碼是:
.c .o .out .h .m
在OC中常見的文件有兩種:.h和.m的文件
擴展名 |
源類型 |
.h |
頭文件,頭文件包含方法,屬性的聲明。 |
.m |
類的實現文件,參與編譯的文件,用來實現類中聲明的方法 |
3.2 基本語法對比
1)數據類型對比學習
2)變數的定義對比
3)流程式控制制語句對比
新增:增強型for迴圈,可以快速遍曆數組、字典等集合
3.3 OC新增的數據類型介紹
邏輯型
1)Boolean(布林)
Boolean 類型指的是用於存儲真值和假值的變數,一般用於程式流程式控制制
Boolean類型數據允許取值true或false,也可以是0或非0的整數替換true和false,這點和java語言不同
如C中是1和0表示真假,OC中也可以用true表示真 false表示假
用來存放true和false的結果的變數一般聲明為Boolean
@autoreleasepool { Boolean flag = false; NSLog(@"%d", flag); //0 }
2)BOOL也是存放邏輯值的另外一種方法
BOOL //它的取值是YES和NO
YES 1 真
NO 0 假
BOOL flag2 = NO; if (flag2){ NSLog(@"%d", flag2); //0 }
3.4 OC中的新增異常捕獲方法
//註意:try catch並不能檢測所有的錯誤 @try { //可能出錯的語句 } @catch (NSException *exception) { //異常捕獲 } @finally { //一定要執行的語句 }
--4-- 面向對象
4.1 編程的實質
軟體編程就是將我們的思維轉變成電腦能夠識別的語言的一個過程
4.2 面向對象的基本概念
面向對象是相對面向過程而言的
面向過程是要關註整個過程的每一步
而對象是關註對象
面向對象程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程式編程範型,同時也是一種程式開發的方法。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程式的基本單元,將程式和數據封裝其中,以提高軟體的重用性、靈活性和擴展性,對象里的程式可以訪問及經常修改對象相關連的數據。在面向對象程式編程里,電腦程式會被設計成彼此相關的對象。
優點:
大幅度提高軟體項目的成功率
減少維護成本
提高可移植性和可靠性
面向對象設計的三個主要特征
封裝性
多態性
抽象性
(還有一個繼承)
--5-- 類和對象
5.1 類和對象
類(class)
在面向對象程式設計,類(英語:class)是一種面向對象電腦編程語言的構造,是創建對象的藍圖,描述了所創建的對象共同的屬性和方法。
類的更嚴格的定義是由某種特定的元數據所組成的內聚的包。它描述了一些對象的行為規則,而這些對象就被稱為該類的實例。類有介面和結構。介面描述瞭如何通過方法與類及其實例互操作,而結構描述了一個實例中數據如何劃分為多個屬性。類是與某個層(這裡的層指類型層次中連接時模塊依賴性相同的類的集合,即某環境下可重用性相同的組件的集合。)的對象的最具體的類型。類還可以有運行時表示形式(元對象),它為操作與類相關的元數據提供了運行時支持。
對象(object)
在電腦科學中,對象(英語:object),臺灣譯作物件,是一個記憶體地址,其中擁有值,這個地址可能有標識符指向此處。對象可以是一個變數,一個數據結構,或是一個函數。是面向對象(Object Oriented)中的術語,既表示客觀世界問題空間(Namespace)中的某個具體的事物,又表示軟體系統解空間中的基本元素。
如下圖,圖紙是類,汽車是對象
類與對象之間的關係
類(Class)一個類由3個部分構成
類的名稱:類名
類的屬性:一組包含數據的屬性
類的方法:允許對屬性中包含的數據進行操作的方法
對象(Object)
是系統中的基本運行實體
對象就是類類型(class type)的變數
定義了一個類,就可以創建這個類的多個對象
一個類是具有相同類型的對象的抽象
一般使用“名詞提煉法”來提取類的抽象
5.2 類的聲明和實現
1)關於類的幾個名詞
.h:類的聲明文件,用於聲明成員變數、方法。類的聲明使用關鍵字@interface...@end
註意:.h的方法只是做一個聲明,並不對方法進行實現,也就是說,只是說明一下方法名、方法的返回值類型、方法接收的參數類型而已,並不會編寫方法內部的代碼。
.m: 類的實現文件,用於實現.h中聲明的方法,類的實現使用關鍵字@implementation...@end
方法
方法的聲明和實現,都必須以 + 或者 - 開頭
"+" 表示類方法(靜態方法)
"-" 表示對象方法(動態方法)
成員變數(實例變數\屬性)
成員變數的作用域有3種:
@public 全局都可以訪問
@protected 只能在類內部和子類中訪問
@private 只能在類的內部訪問
2)類的定義分為兩部分:
1)類的聲明(規定當前類的:類名、屬性、行為)
@interface 類名:父類名 { //定義類的屬性 } //定義類的行為 @end //表示結束
2)類的實現(實現類的具體行為)
@implementation 類名 //行為的具體實現 @end
5.3 對象的存儲細節
用類來創建對象,每個對象在記憶體中都占據一定的存儲空間,每個對象都有一份屬於自己的單獨的成員變數,所有的對象共用類的成員方法,方法在整個記憶體中只有一份,類本身在記憶體中占據一份存儲空間,類的方法存儲於此。
Person類
Person.h
//Person類聲明 @interface Person : NSObject { @public //公有屬性 NSString *_name; int _age; } -(void)run; @end
Person.h
//Person類實現 @implementation Person -(void)run{ NSLog(@"%@正在跑", _name); } @end
創建對象及調用其方法
int main(int argc, const char * argv[]) { @autoreleasepool { //創建Person Person *person = [Person new]; person->_name = @"柯南"; //設置成員屬性 person->_age = 12; NSLog(@"name->%@, age->%d", person->_name, person->_age); [person run]; //調用對象方法 } return 0; }
創建對象[Person new]時做了3件事情
1,申請記憶體空間
2,給實例變數初始化
3,返回空間的首地址
問題:
1、申請的空間在記憶體的哪個區?
new時,申請的空間在記憶體的堆區(動態分配的記憶體空間)
初始化時,如果實例變數是基本數據類型,此時初始化為0
如果是OC字元串類型,則初始化為null
2、實例變數又保存在什麼地方
實例變數保存在記憶體中的堆區
指針變數p存放在棧區
3、對象方法保存在什麼地方
-->代碼區
4、為什麼使用[person run];就可以調用方法了?如何調用?
先找到p對應的堆區空間-->找到_isa指針-->找到_isa指向的代碼區空間-->在該空間中找到方法
【寫在結尾:】
『hello, world』