「通過執行時,分類是可以在不新增成員變數的情況下新增屬性的!」
遇到乙個問題,寫了乙個分類,但原先類的屬性不夠用。新增乙個屬性,呼叫的時候崩潰了,說是找不到getter、setter方法。查了下文件發現,oc的分類允許給分類新增屬性,但不會自動生成getter、setter方法。有沒有解決方案呢?有,通過執行時建立關聯引用。接下來以新增乙個這樣的屬性為例:
@property (nonatomic, copy) nsstring *str;
1、引入執行時標頭檔案。
#import
2、在匿名分類或者標頭檔案中新增屬性。區別是:匿名分類中新增的是私有屬性,只在本類中可以使用,類的例項中不可以使用。標頭檔案中新增的在類的例項中也可以使用。
//分類的標頭檔案
@inte***ce
classname (categoryname)
//我要新增乙個例項也可以訪問的變數所以就寫在這裡了
@property (nonatomic, strong) nsstring *str;
@end
//匿名分類
@inte***ce
classname ()
@end
3、在實現裡面寫要新增屬性的getter、setter方法。
@implementation
classname (categoryname)
-(void)setstr:(nsstring *)str
-(nsstring *)str
@end
在setstr:
方法中使用了乙個objc_setassociatedobject
的方法,這個方法有四個引數,分別是:源物件,關聯時的用來標記是哪乙個屬性的key(因為你可能要新增很多屬性),關聯的物件和乙個關聯策略。
用來標記是哪乙個屬性的key常見有三種寫法,但**效果是一樣的,如下:
//利用靜態變數位址唯一不變的特性
1、static
void *strkey = &strkey;
2、static nsstring *strkey = @"strkey";
3、static
char strkey;
關聯策略是個列舉值,解釋如下:
enum ;
4、完成後的整體**如下:
.h檔案
//分類的標頭檔案
@inte***ce
classname (categoryname)
@property (nonatomic, strong) nsstring *str;
@end
.m檔案
//實現檔案
#import "classname + categoryname.h"
#import
static
void *strkey = &strkey;
@implementation
classname (categoryname)
-(void)setstr:(nsstring *)str
-(nsstring *)str
@end
自動閱讀 到底 能不能賺錢
如今很流行的自動閱讀到底是乙個怎麼回事呢?到底什麼是自動閱讀呢?自動閱讀到底有沒有發展的前景呢?自動閱讀到底能不能賺錢呢?那麼自動閱讀到底有沒有發展前景呢?這個需要從幾個方面進行討論。要想進行手機批量自動閱讀進行賺錢,當然不能只是在一台兩台手機上進行,這樣子的效率是非常低的,即使你的手機二十四小時都...
jquery能不能自定義屬性
jquery能自定義屬性。jquery中,可用attr 來給元素新增自定義屬性,並設定屬性值 若只新增單個屬性,可用 元素物件.attr 屬性名 值 若多個屬性則用 元素物件.attr 本教程操作環境 windows7系統 jquery1.10.2版本 dell g3電腦。jquery能自定義屬性。...
為or in平反 or in到底能不能利用索引?
先說乙個笑話,作為開場白。俺也換換風格試一試,呵呵。在以前,有三個書生趕考,在路上遇到了乙個算命先生,於是就問算命先生 我們三個人趕考,結果如何呀?算命先生伸出來了乙個手指頭 食指 三個書生趕考的結果是,有乙個人考中了。三人一想呀,這個掛算的對呀,有乙個人考中了嘛。其實 乙個手指頭 是很模糊的,很忽...