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;