標籤:des style blog color 使用 io strong 檔案
一、點文法
點文法的本質還是方法調用
p.age = 10; // [p setAge:10];int a = p.age; // [p age];
二、成員變數的範圍
@public : 在任何地方都能直接存取對象的成員變數 @private : 只能在當前類的對象方法中直接存取(@implementation中預設是@private) @protected : 可以在當前類及其子類的對象方法中直接存取 (@interface中預設就是@protected) @package : 只要處在同一個架構中,就能直接存取對象的成員變數
@interface和@implementation中不能聲明同名的成員變數
三、@property和@synthesize
@property:可以自動產生某個成員變數的setter和getter聲明
@property int age;//- (void)setAge:(int)age;//- (int)age;
@synthesize自動產生age的setter和getter實現,並且會訪問_age這個成員變數
@synthesize age = _age;
預設會訪問age這個成員變數,如果沒有age,就會自動產生@private類型的age變數
四、id
id == NSObject *
萬能指標,能指向\操作任何OC對象
五、構造方法1.構造方法:
用來初始化對象的方法,是個對象方法,-開頭
2.重寫構造方法的目的:
為了讓對象建立出來,成員變數就會有一些固定的值
3.重寫構造方法的注意點
1>先調用父類的構造方法([super init])
2>再進行子類內部成員變數的初始化
4.自訂構造方法
自訂構造方法的規範
1>一定是對象方法,一定以 - 開頭
2>傳回值一般是id類型
3>方法名一般以initWith開頭
六、分類-Category1. 基本用途
- 如何在不改變原來類模型的前提下,給類擴充一些方法?有2種方式
l 繼承
l 分類(Category)
2. 格式
@interface 類名 (分類名稱)// 方法聲明@end
@implementation 類名 (分類名稱)// 方法實現@end
3. 好處
一個龐大的類可以分模組開發
一個龐大的類可以由多個人來編寫,更有利於團隊合作
4. 給系統內建的類添加分類
給NSString增加一個類方法:計算某個字串中阿拉伯數位個數
給NSString增加一個對象方法:計算當前字串中阿拉伯數位個數
5. 注意
1.分類只能增加方法,不能增加成員變數
2.分類方法實現中可以訪問原來類中聲明的成員變數
3.分類可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,會導致原來的方法沒法再使用
4.方法調用的優先順序:分類(最後參與編譯的分類優先) > 父類
七、類的本質
(類庫:很多類的集合)
1. 類也是個對象
- 其實類也是一個對象,是Class類型的對象,簡稱“類對象”
- Class類型的定義
typedef struct objc_class *Class;
2. +load和+initialize
l 在程式啟動的時候會載入所有的類和分類,並調用所有類和分類的+load方法
l 先載入父類,再載入子類;也就是先調用父類的+load,再調用子類的+load
l 先載入元原始類,再載入分類
l 不管程式運行過程有沒有用到這個類,都會調用+load載入
l 在第一次使用某個類時(比如建立對象等),就會調用一次+initialize方法
l 一個類只會調用一次+initialize方法,先調用父類的,再調用子類的
3. 擷取類對象的2種方式
Class c = [Person class]; // 類方法
或者
Person *p = [Person new];Class c2 = [p class]; // 對象方法
4. 類對象調用類方法
Class c = [Person class];Person *p2 = [c new];
八、description方法1. -description方法
使用NSLog和%@輸出某個對象時,會調用對象的-description方法,並拿到傳回值進行輸出
2. + description方法
使用NSLog和%@輸出某個類對象時,會調用類對象+description方法,並拿到傳回值進行輸出
3. 修改NSLog的預設輸出
l 重寫-description或者+description方法即可
4. 死迴圈陷阱
l 如果在-description方法中使用NSLog列印self
九、SEL1. 方法的儲存位置
- 每個類的方法列表都儲存在類對象中
- 每個方法都有一個與之對應的SEL類型的對象
- 根據一個SEL對象就可以找到方法的地址,進而調用方法
- SEL類型的定義
typedef struct objc_selector *SEL;
2. SEL對象的建立
SEL s = @selector(test);SEL s2 = NSSelectorFromString(@"test");
3. SEL對象的其他用法
// 將SEL對象轉為NSString對象NSString *str = NSStringFromSelector(@selector(test));Person *p = [Person new];// 調用對象p的test方法[p performSelector:@selector(test)];
十、NSLog輸出增強
預設情況下,利用NSLog和%@輸出對象時,結果是:<類名:記憶體位址>
- __FILE__ :原始碼檔案名稱
- __LINE__ :NSLog代碼在第幾行
- _cmd :代表著當前方法的SEL
// 下面的代碼會引發死迴圈- (void)test { [self performSelector:_cmd];}