1. 程式人生 > IOS開發 >一次標籤指標(Tagged Pointer)導致的事故

一次標籤指標(Tagged Pointer)導致的事故

前言

最近遇到一起由objc_setAssociatedObjectobjc_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; } 複製程式碼