Object C學習筆記18-SEL,@ selector,Class,@class

賀臣發表於2014-03-22

  本章是對上一章<<Object C學習筆記17-動態判斷和選擇器>>的一點補充,所以比較簡單點。

 

  一. SEL 型別

    在上一篇介紹了幾個方法,都只是介紹了其使用方式但是沒有具體介紹引數:

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
- (BOOL)respondsToSelector:(SEL)aSelector;

    其中有看到SEL型別。SEL相當於函式指標。下面介紹performSelector方法:

    [物件 performSelector:SEL變數 withObject:引數1 withObject:引數2]; 
在呼叫respondsToSelector:@selector(method)時,這個method只有在該方法存在引數時需要 ":",如果該方法不需要引數就不需要加這個冒號。否則,編譯不會報錯,只是執行返回的值不對。當然如果方法有多個引數,需要多個冒號,引數有名稱的需要帶上引數名稱。 

 

  二. @selector 

    @selector 其實就是選擇器,使用@selector放回SELleixing,所以SEL和@selector一般都是同時使用的。

SEL sel=@selector(write:andAge:);

    @selector方法用法如上,但是這裡要注意一下如果方法有輸入引數則需要使用: ,如果沒有引數則不要:

SEL sel1=@selector(eat);

    如果使用可以參考上一章所述內容。

 

  三. Class

    先看看Class型別的程式碼如下:

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

    從上面的程式碼可以看到Class 是結構型別,可以使用如下方式獲取一個物件的Class

Class c=[Person class];

 

  四. @class

  由於標頭檔案的相互包含及依賴關係,往往很小的改動就需要重新編譯很多的檔案。Object-C提供了一種方法可以減少由於依賴引起的重新編譯:@class 來告訴編譯器這是一個類,編譯器只需要通過指標來引用它即可,並不需要知道關於這個類的更多資訊。以此來減少編譯工作。

#import <Foundation/Foundation.h>
@class Person;
@interface Student : NSObject{
    Person *p;
}
@end

  通過以上程式碼可以看到,@class Person . 然後我們在Student 類中就可以直接引用Person這個類了。在以往的時候需要使用

  #import "Person.h" 才可以。 我們使用@class 替換之前的這種方式。

 

 

相關文章