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);
相關文章
- class屬性的新增刪除
- onethink 1.1中category表中display屬性,幾乎沒用啊Go
- 給Product新增自定義屬性
- ObjC中Category的原理簡析OBJGo
- ubuntu下OpenLDAP新增自定義屬性UbuntuLDA
- Android property屬性許可權新增Android
- css3新增哪些背景屬性CSSS3
- 手撕Vue-Router-新增全域性$router屬性Vue
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- 精讀《使用 CSS 屬性選擇器》CSS
- 為 protocol 中屬性新增預設值Protocol
- shopify 屬性新增圖片及樣式
- html5/css3新增屬性HTMLCSSS3
- Python給exe新增以管理員執行的屬性Python
- Hugging Face 分詞器新增聊天模板屬性Hugging Face分詞
- 使用React構建精簡版本掘金(二)React
- 使用React構建精簡版本掘金(四)React
- 使用React構建精簡版本掘金(三)React
- 使用React構建精簡版本掘金(一)React
- 為QT程式增加版本等屬性資訊QT
- 如何實現分類中新增弱引用屬性
- Python日誌記錄中新增自定義屬性Python
- JS/JQ動態建立(新增)optgroup和option屬性JS
- Vue 不能檢測到物件屬性的新增或刪除,注意!!!Vue物件
- 動態建立節點並且給建立的元素新增屬性
- HTML5中新新增的表單屬性有哪些?HTML
- Python 類的屬性與例項屬性Python
- line-height與vertical-align:簡單的屬性不簡單
- CMake 屬性之全域性屬性
- Wordpress自動給圖片新增alt和title屬性
- 簡單聊一聊Flex佈局常用的屬性Flex
- jquery js 設定 div 的內容,給 div 新增一個屬性jQueryJS
- defer 屬性和 async 屬性
- logback 的屬性
- 元素 offset client scroll 相關屬性簡介client
- 如何自動地向知識圖譜中新增屬性?
- Python 簡明教程 --- 20,Python 類中的屬性與方法Python
- WPF一個簡單的屬性編輯控制元件控制元件
- *{}慎用,會連title,script,style這些都新增上相應的屬性