Category新增weak屬性的精簡版本
網上有很多版本,我提供一種不用加新類就可以實現的方法。
建立NSObject的Category
NSObject+Ext.h
#import <Foundation/Foundation.h>
typedef void (^DeallocBlock)();
@interface NSObject (Ext)
@property (nonatomic, weak) id weakObj;
@property (nonatomic, copy) DeallocBlock block;
@end
NSObject+Ext.m
#import "NSObject+Ext.h"
#import <objc/runtime.h>
static NSString *WEAK_KEY = @"weakObj";
static NSString *BLOCK_KEY = @"block";
@implementation NSObject (Ext)
- (id)weakObj {
return objc_getAssociatedObject(self, &WEAK_KEY);
}
- (void)setWeakObj:(id)weakObj {
[weakObj setBlock:^() {
objc_setAssociatedObject(self, &WEAK_KEY, nil, OBJC_ASSOCIATION_ASSIGN);
}];
objc_setAssociatedObject(self, &WEAK_KEY, weakObj, OBJC_ASSOCIATION_ASSIGN);
}
- (DeallocBlock)block {
return objc_getAssociatedObject(self, &BLOCK_KEY);
}
- (void)setBlock:(DeallocBlock)block {
objc_setAssociatedObject(self, &BLOCK_KEY, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (void)dealloc {
self.block ? self.block() : nil;
objc_setAssociatedObject(self, &BLOCK_KEY, nil, OBJC_ASSOCIATION_ASSIGN);
}
#pragma clang diagnostic pop
@end
測試用法
NSObject *obj1 = [NSObject new];
NSObject *obj2 = [NSObject new];
obj1.weakObj = obj2;
NSLog(@"%@", obj1.weakObj);
obj2 = nil;
NSLog(@"%@", obj1.weakObj);
相關文章
- Runtime 系列 3-- 給 category 新增屬性Go
- iOS runtime 給 Category 加屬性iOSGo
- 老生常談category增加屬性的幾種操作Go
- rcp新增屬性
- iOS開發 Runtime是如何實現weak屬性的?iOS
- class屬性的新增刪除
- Objective-C語言在Category中實現屬性ObjectC語言Go
- 為textarea新增maxlength屬性
- PropertyGrid控制元件 分類(Category)及屬性(Property)排序控制元件Go排序
- Category – 簡介Go
- js的屬性物件的specified屬性用法簡單介紹JS物件
- Runtime之分類新增屬性
- css3新增屬性APICSSS3API
- 為普通Object新增類似AttachedProperty的屬性Object
- ubuntu下OpenLDAP新增自定義屬性UbuntuLDA
- css3新增哪些背景屬性CSSS3
- js給html標籤新增屬性JSHTML
- Android自定義View 屬性新增AndroidView
- 給自定義View新增xml屬性ViewXML
- 【Swift】在extension裡面新增屬性Swift
- 精讀《使用 CSS 屬性選擇器》CSS
- 手撕Vue-Router-新增全域性$router屬性Vue
- onethink 1.1中category表中display屬性,幾乎沒用啊Go
- iOS使用Category新增@property變數iOSGo變數
- 如何刪除使用prop()方法新增的屬性
- ObjC中Category的原理簡析OBJGo
- shopify 屬性新增圖片及樣式
- 為 protocol 中屬性新增預設值Protocol
- js為物件新增和刪除屬性JS物件
- html5之新增表單屬性HTML
- html5新增及廢除屬性HTML
- Java JDK各個版本的新特性、屬性(JVM)JavaJDKJVM
- css的透明屬性簡單介紹CSS
- js自動新增的物件屬性並非完全按照新增的順序排列JS物件
- 使用React構建精簡版本掘金(四)React
- 使用React構建精簡版本掘金(三)React
- 使用React構建精簡版本掘金(二)React
- 使用React構建精簡版本掘金(一)React