OC中的SEL與C中的const void *
開頭先說明一下,之所以把這二者放在一起比較,是因為今天看到了一個很有趣的寫法
- (void)setLk_imageInfo:(LKImageInfo *)imageInfo
{
objc_setAssociatedObject(self, @selector(setLk_imageInfo:), imageInfo, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
我們都知道,在OC中如果想給分類新增屬性@property
是不能直接生成對應的setter
和getter
的而且即使手寫setter
和getter
也不能使用例項變數,所以只能通過runtime
中這種關聯的形式來繫結特定物件。
再來看一下objc_setAssociatedObject
的定義:
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
id _Nullable value, objc_AssociationPolicy policy)
可以看到第二個引數key
需要一個 const void *
型別的引數作為繫結的key,以往我在使用這個方法的時候都會自己生成一個key,而今天看到的程式碼中則使用了@selector(setLk_imageInfo:)
,傳入了一個SEL
,對此我也做了簡單的實驗。
先來看一下SEL
的定義:
/// An opaque type that represents a method selector.
typedef struct objc_selector *SEL;
可以看到SEL
是一個結構體指標,而 const void *
是一個無型別指標常量,所以從 SEL -> const void*
來賦值是說得通的,但是如果想反過來使用是不可以的。
const void *sel = @selector(beginTimer);
Obj *obj = [Obj new];
[obj performSelector:sel];
最開始對sel的賦值並不會有警告,因為void*本身就是無型別,但是這段程式碼將無法執行並且報錯。
最後,今天也算是學到了一個寫關聯的時候偷懶的好方法:D。
相關文章
- C/C++中的constC++
- C++ 中的 const 物件與 const 成員函式C++物件函式
- C++中const的用法C++
- C++中const的妙用C++
- C++中const與指標、引用的總結C++指標
- C++中const的簡單用法C++
- C++中的 const 關鍵字C++
- C++ const void * 型別轉換簡單測試C++型別
- C++中const小結C++
- const關鍵字在C與C++中修飾變數的區別C++變數
- C++中string、char *、char[]、const char*的轉換C++
- C#中const 和 readonly 修飾符的用法詳解C#
- java中的引用與c中的指標Java指標
- JavaScript中let、const、var 的區別JavaScript
- 深度學習在OC中的應用深度學習
- C++ const常量的理解C++
- C++中函式後面加const修飾C++函式
- C語言 關鍵字const的作用 const int* 和int *const 的區別C語言
- JavaScript中的var、let 及 const 區別JavaScript
- ES6中let 和 const 的新特性
- ES6中var,let,const的區別
- 你知道void和Void的區別嗎
- NSObject +(void)load 和+(void)initialize 方法的理解Object
- Runtime 、 SEL and KVO
- Covariance, Contravariance以及Generics在 Swift/OC 中的應用.Swift
- const與static的區別
- 深入理解 MVC 中的 M 與 CMVC
- C/C++const用法C++
- VS C++ 2017中const char* 型別的值不能用於初始化char*的解決C++型別
- let const快取for迴圈的中間變數快取變數
- TypeScript 中 as const 是什麼TypeScript
- C++ 頂層const底層constC++
- BOOST應用 無法解析的外部符號 "void __cdecl boost::throw_exception(class std::exception const &)"符號Exception
- c++中的變數型別_C ++中的變數C++變數型別
- OC/Swift/C/C++混合使用的程式設計姿勢SwiftC++程式設計
- ES6中let和var和const的區別
- go中,iota要放在const的最前面來宣告Go
- JavaScript 中的 Var,Let 和 Const 有什麼區別JavaScript