我遇到了NSTimer
和userInfo
的问题
在the docs Apple写道,系统保留了对Timer(以及userInfo?)的强引用,但有时当我试图访问userInfo对象的部分时,我得到 Bad Access异常。 (Afaik意味着发生了非常糟糕的事情)
不用多说,这就是我传递给userInfo的对象的样子:
@interface MyObject
@property (nonatomic, assign) u_int8_t cmd;
@property (nonatomic, assign) NSNumber *_id;
@end
以下是我设置Timer的方法:
NSTimer *myTimer = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(someMethod:) userInfo:message repeats:NO];
[[NSRunLoop mainRunLoop] myTimer forMode:NSDefaultRunLoopMode];
Timer触发时触发的方法
-(void) someMethod:(NSTimer *)timer{
MyObject* mObject = [timer userInfo];
u_int8_t cmd = mObject.cmd; // This works
NSNumber *_id = mObject._id; // Bad access
}
注意:userInfo本身不是nil。 u_int8_t
无论是{0}还是零。但是一旦我尝试访问NSNumber
对象,我就会收到以下异常(不一定每次都有):
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x00000000
如果我向NSNumber对象添加strong
属性会怎样?这会解决问题吗?为什么?为什么这个问题首先发生?
答案 0 :(得分:1)
属性声明错误。
NSNumber
是一个对象。属性类型必须是强或复制。
@property (nonatomic, copy) NSNumber *_id;
答案 1 :(得分:1)
由于employee.employee_id
是一个对象,您需要使用NSNumber
属性,这是默认值,因此请将strong
声明更改为:
@property
使用@property (nonatomic) NSNumber *_id;
作为标识符是一个坏主意,因为_id
是一个Objective-C关键字,您可能会在某些时候感到困惑。