核心語法
一、 點語法
p.age不是訪問的成員變量,而這就是oc中的點語法,點語法的本質是方法的調用,而不是訪問成員變量,當使用點語法時,編譯器會自動展開相應的方法。切記點語法的本質是轉換成相應的set和get方法。
(在OC中訪問成員變量的方法只有一種,“->”作爲訪問成員變量的方法)
點語法使用注意:
a) Self.age= age; return self.age;這兩種情況下會引發死循環!
b) 如果沒有set和get方法,則不能使用點語法。
二、 成員變量的作用域:
a) @private:只能在當前類的實現@implementation中直接訪問
b) @protected :可以在當前類以及子咧的實現@implementation中直接訪問
c) @public:任何地方都可以直接訪問;
d) @package:同一個“體系內”(框架)可以訪問,介於@private跟@public之間
注意:
a) 當父類中聲明的變量爲@private變量在子類中只能通過set和get方法訪問變量
b) 當在聲明中沒有特別支持類的類型則默認的類的類型爲@protected類型
c) 在實現中也可以聲明成員變量,但寫的成員變量只默認爲私有的,不會出現其他類型,即使你寫成別的類型,也只能爲私有的類型,子類是無法訪問的,在.m中的成員變量中不能存在與@interface中同名的成員變量!
d) 寫類的聲明是爲了保證類的完整性,但是不寫聲明直接在.m中寫方法的實現也是可以的。當在main.m中直接寫的實現.m中就可以直接定義成員變量類型
三、 @property 和@synthsize和id
@property可以自動生成某個成員變量的set和get方法的聲明
@synthsize可以自動生成某個成員變量的set和get方法的實現
例如:@sythsize age=_age;
@synthsize自動生成age的set跟get方法的實現,並且訪問_age這個成員變量;
@property可以實現三步:
定義變量
實現方法
實現聲明
注意這個是在xcode4.4版本之後才實現的!
@synthsize的細節:
1.@synthsize age = _age;
Set和get實現中會訪問成員變量_age;
如果成員變量_age不存在,就會自動生成一個@private的成員變量_age;
2. @synthsizeage;
Set 和get實現中會訪問成員變量age
如果成員變量age不存在,就會自動程程一個@private的成員變量age
3. 手動實現
若手動實現set方法,編譯器就只會生成get方法
若手動實現get方法,編譯器就只會生成set方法
若同時手動實現了set方法和get方法,編譯器就不會自動生成不存在的成員變量
四、 id
id是指萬能指針,能指向\操縱任何OC對象;
注意:寫id的時間不要寫*;
侷限性:調用一個不存在的方法,編譯器會馬上報錯!
例如:
Person *p = [Person new];
NSObject *o = [Person new];
Id d = [Person new];
五、 構造方法
完整的創建一個可用對象分爲兩步:
分配存儲空間 +alloc
初始化 -init
New方法是創建一個對象的方法,[Person new]是一個類方法。
構造方法的用途是用來初始化對象的方法,是一個以“-”開頭的對象方法(默認初始化完了之後的值都是0)
Person *p = [[Person alloc] init];
例題:
每個Person對象創建出來,它的age都是10.
重寫init構造方法條件
1. 一定要調用回super的init方法:初始化父類中聲明的一些成員變量和其他屬性。
Self = [super init];//當前對象 self
2. 如果對象初始化成功,纔有必要進行下來的初始化
If(self!=nil)
{
//初始化成功
_age = 10;
}
3. 然會初始化的數值
Return self;
以上代碼簡化後:
-(id)init
{
If(self = [super init])
{
_age=10;
}
Returnself;
}
重寫構造方法的注意點:
a) 先調用父類的構造方法([superinit])
b) 在進行子類內部成員變量的初始化
自定義構造方法:
1) 命名規範
a) 一定是對象方法,一定以“-”開頭
b) 返回值一般是id類型
c) 方法名一般以init開頭
2) 自定義構造方法的用途:初始化值
a) 當父類中的成員變量存在的時間我們僅僅需要直接將需要初始化的值直接傳到父類中初始化即可
b) 父類的屬***給父類方法處理,子類僅需要處理自己的屬性即可
六、 類別\分類Category
給某一個類擴充一些方法(不修改原來類的代碼);
//聲明
@interface 類名(分類名稱)
@end
//實現
@implementation 類名(分類名稱)
@end
分類的作用:
在不改變原來類內容的基礎上,可以增加一些方法
使用注意:
1. 分類只能增加方法,不能增加成員變量!
2. 分類方法實現中可以訪問原來類中聲明的成員變量
3. 分類可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,會導致原來的方法失效沒法繼續使用
4. 方法調用的優先級:分類à原來的類à父類
類庫:很多類的集合;
類的本身也是一個對象是一個class類型的對象,即是類對象;
七、 Load方法和initalize方法
Initialize方法可以看成類的初始化!
Load方法在程序加載使用時就被調用,當程序第一次加載使用時就調用initalize方法
1. 當程序啓動時,就會加載項目中所有的類和分類,而且加載後會調用每個類和類的+load方法。只會調用一次
2. 當第一次使用某個類的時間,就會調用當前類的+initialize方法
3. 先加載父類,在加載子類(先調用父類的load方法在調用子類的load方法)
先初始化父類,在初始化子類(先調用個父類的+initalize方法,在調用子類的+initalize方法)
Initialize方法可以起到監聽的作用!可以知道這個類什麼時間第一次被使用!
分類的load方法是在最後被加載的
Description方法:
+description()決定類對象的輸出結果
-description()決定了實例對象輸出的結果
地址:%p
__LINE__ ---------à行號 NSLog(@“%d”__LINE__);
__FILE__ ---------à文件 NSLog(@“%s”__FINLE__);
NSLog輸出C語言字符串的時間不能有中文
__func__ ---------à方法 NSLog(@“%s”__Lfunc__);
八、 SEL方法
1. 方法的存儲位置
a) 每個類的方法列表都儲存在類對象中
b) 每個方法都有一個與之對應的sel類型的對象
c) 根據一個sel對象就可以找到方法的地址,進而調用方法
d) Sel類型的定義
typedef struct objc selector *SEL
2. SEL對象的創建
SEL s = @selector(test);
SEL s2 =NSSelectorFromString(str);
SEL 其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址,找到方法地址就可以調用方法
其實消息就是SEL