NSTimer userInfo Bad 访问异常

NSTimer userInfo Bad Access exception

我遇到了 NSTimeruserInfo 的问题。
the docs Apple 中写道,系统保持对 Timer(以及 userInfo?)的强引用,但有时当我尝试访问 userInfo 对象的部分时,我得到一个 Bad访问异常。 (Afaik,这意味着发生了非常糟糕的事情)

事不宜迟,这是我传递给 userInfo 的对象的样子:

@interface MyObject

@property (nonatomic, assign) u_int8_t cmd;
@property (nonatomic, assign) NSNumber *_id;

@end

下面是我设置定时器的方法:

NSTimer *myTimer = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(someMethod:) userInfo:message repeats:NO];
[[NSRunLoop mainRunLoop] myTimer forMode:NSDefaultRunLoopMode];

定时器触发时触发的方法

-(void) someMethod:(NSTimer *)timer{
    MyObject* mObject = [timer userInfo];
    u_int8_t cmd = mObject.cmd; // This works
    NSNumber *_id = mObject._id; // Bad access
}

注意:userInfo 本身不是零。 u_int8_t nil 也不是。但是,一旦我尝试访问 NSNumber 对象,我就会收到以下异常(不一定每次):

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x00000000

如果我向 NSNumber 对象添加 strong 属性 会怎样?这会解决问题吗?为什么?为什么首先会出现这个问题?

属性声明错误。 NSNumber 是一个对象。 属性 类型必须是 strong 或 copy。

@property (nonatomic, copy) NSNumber *_id;

由于 NSNumber 是一个对象,您需要使用默认的 strong 属性,因此将 @property 声明更改为:

@property (nonatomic) NSNumber *_id;

并且使用 _id 作为标识符是一个坏主意,因为 id 是一个 Objective-C 关键字,您可能会在某些时候混淆自己。