一次標籤指標(Tagged Pointer)導致的事故
阿新 • • 發佈:2020-06-24
前言
最近遇到一起由objc_setAssociatedObject
和objc_getAssociatedObject
引發的線上Crash事故,在痛心疾首的同時也覺得很有意思,特此分享。
正文
問題背景
專案中已經存在某個Catagory,會往一個第三方庫的類中掛載一個屬性,用下面程式碼的TestCatagory中ssShowTime屬性來表示。
@interface ViewController(TestCategory)
@property (nonatomic,assign) long ssShowTime;
@end
複製程式碼
具體的實現是用objc_setAssociatedObject
objc_getAssociatedObject
方法。
@implementation ViewController (TestCategory)
- (void)setSsShowTime:(long)ssShowTime {
NSNumber *number = @(ssShowTime);
objc_setAssociatedObject(self,@selector(ssShowTime),number,OBJC_ASSOCIATION_ASSIGN);
}
- (long)ssShowTime {
NSNumber *number = objc_getAssociatedObject(self,@selector(ssShowTime));
return [number longValue];
}
@end
複製程式碼
該方法已經跑了好幾個版本,沒有出現過任何問題。 後面在此基礎上又新增一個掛載屬性,我們用ssLocalDesc來表示。
@property (nonatomic,strong) NSString *ssLocalDesc;
- (void)setSsLocalDesc:(NSString *)ssLocalDesc {
objc_setAssociatedObject(self,@selector(ssLocalDesc),ssLocalDesc,OBJC_ASSOCIATION_ASSIGN);
}
- (NSString *)ssLocalDesc {
NSString *ret = objc_getAssociatedObject(self,@selector(ssLocalDesc));
return ret;
}
複製程式碼