【黑馬程式員】————OC特有文法

來源:互聯網
上載者:User

標籤: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
  • +load

l   在程式啟動的時候會載入所有的類和分類,並調用所有類和分類的+load方法

l   先載入父類,再載入子類;也就是先調用父類的+load,再調用子類的+load

l   先載入元原始類,再載入分類

l   不管程式運行過程有沒有用到這個類,都會調用+load載入

 

  • +initialize

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];}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.