如何實現(xiàn)分類中添加弱引用屬性

需求: 實現(xiàn)分類中添加弱引用屬性

@interface ViewController (WeakDelegate)

@property (nonatomic, weak) id delegate;

@end

眾所周知runtime中關(guān)聯(lián)屬性的幾種類型如下:

/**
 * Policies related to associative references.
 * These are options to objc_setAssociatedObject()
 */
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
                                            *   The association is made atomically. */
    OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.
                                            *   The association is made atomically. */
};

但如果想實現(xiàn)弱引用的關(guān)聯(lián)對象就無法使用上面任意一條枚舉。
這里通過使用block打包/解包的方式完成需求关串。

首先邢滑,定義打包和解包函數(shù):

typedef id weakid;
typedef weakid(^WeakReference)(void);

WeakReference packWeakReference(id ref) {
    __weak weakid weakRef = ref;
    return ^{
        return weakRef;
    };
}

weakid unpackWeakReference(WeakReference closure) {
    return closure ? closure() : nil;
}

然后拴曲,在常規(guī)的形式下添加打包和解包即可:

@implementation ViewController (WeakDelegate)

- (void)setDelegate:(id)delegate
{
    objc_setAssociatedObject(self, @selector(delegate), packWeakReference(delegate), OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (id)delegate
{
    return unpackWeakReference(objc_getAssociatedObject(self, @selector(delegate)));
}

@end

以下為測試代碼

@interface ViewController ()

@property (nonatomic, strong) id ref;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSObject *test = [NSObject new];
    NSLog(@"%p",test);
    NSLog(@"1 == %@", [test valueForKey:@"retainCount"]);
    
    _ref = test;
    NSLog(@"2 == %@", [test valueForKey:@"retainCount"]);
    
    self.delegate = test;
    NSLog(@"3 == %@", [test valueForKey:@"retainCount"]);
    
    NSLog(@"%p",self.delegate);
}

@end

打印結(jié)果:

testCategoryWeakDelegate[65095:1585708] 0x600000208690
testCategoryWeakDelegate[65095:1585708] 1 == 1
testCategoryWeakDelegate[65095:1585708] 2 == 2
testCategoryWeakDelegate[65095:1585708] 3 == 2
testCategoryWeakDelegate[65095:1585708] 0x600000208690

完白嘁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末心墅,一起剝皮案震驚了整個濱河市翩迈,隨后出現(xiàn)的幾起案子持灰,更是在濱河造成了極大的恐慌,老刑警劉巖负饲,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堤魁,死亡現(xiàn)場離奇詭異,居然都是意外死亡返十,警方通過查閱死者的電腦和手機妥泉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洞坑,“玉大人盲链,你說我怎么就攤上這事〕僭樱” “怎么了刽沾?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長排拷。 經(jīng)常有香客問我侧漓,道長,這世上最難降的妖魔是什么监氢? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任布蔗,我火速辦了婚禮,結(jié)果婚禮上浪腐,老公的妹妹穿的比我還像新娘何鸡。我一直安慰自己,他們只是感情好牛欢,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布骡男。 她就那樣靜靜地躺著,像睡著了一般傍睹。 火紅的嫁衣襯著肌膚如雪隔盛。 梳的紋絲不亂的頭發(fā)上犹菱,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音吮炕,去河邊找鬼腊脱。 笑死,一個胖子當(dāng)著我的面吹牛龙亲,可吹牛的內(nèi)容都是我干的陕凹。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼鳄炉,長吁一口氣:“原來是場噩夢啊……” “哼杜耙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拂盯,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤佑女,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谈竿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體团驱,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年空凸,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚎花。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡呀洲,死狀恐怖紊选,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情两嘴,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布族壳,位于F島的核電站憔辫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仿荆。R本人自食惡果不足惜贰您,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拢操。 院中可真熱鬧锦亦,春花似錦、人聲如沸令境。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舔庶。三九已至抛蚁,卻和暖如春陈醒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞧甩。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工钉跷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚逸。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓爷辙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朦促。 傳聞我的和親對象是個殘疾皇子膝晾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容