Ios NSTimer userInfo错误访问异常

Ios NSTimer userInfo错误访问异常,ios,objective-c,nstimer,Ios,Objective C,Nstimer,我的NSTimer和userInfo有问题 苹果在书中写道,系统保留了对计时器的强引用(因此也保留了userInfo?),尽管有时当我试图访问userInfo对象的某些部分时,会遇到错误的访问异常。(这意味着发生了一些非常糟糕的事情) 不用多说,下面是我传递给userInfo的对象的外观: @interface MyObject @property (nonatomic, assign) u_int8_t cmd; @property (nonatomic, assign) NSNumber

我的
NSTimer
userInfo
有问题
苹果在书中写道,系统保留了对计时器的强引用(因此也保留了userInfo?),尽管有时当我试图访问userInfo对象的某些部分时,会遇到错误的访问异常。(这意味着发生了一些非常糟糕的事情)

不用多说,下面是我传递给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\u int8\t
nil还是其他什么。但是,当我尝试访问
NSNumber
对象时,我会收到以下异常(不一定每次都是):


如果向NSNumber对象添加
strong
属性,会发生什么情况?这能解决问题吗?为什么?为什么会出现这个问题?

属性声明是错误的。
NSNumber
是一个对象。属性类型必须为“强”或“复制”

@property (nonatomic, copy) NSNumber *_id;

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

@property (nonatomic) NSNumber *_id;

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

您正在访问与标题定义不同的属性,您能更新您的代码吗?@TomášLinhart您是对的-只是更新了它,谢谢。只是想了解一下这个问题:这是否意味着ARC基本上是回收userInfo对象的NSNumber对象,而不是回收对象本身?基本上是的,但坏的是它在
userInfo
字典中保留了指向
NSNumber
对象的悬空指针,这是异常的原因,因为对象不再有效。
@property (nonatomic) NSNumber *_id;