NSTimer userInfo Bad Access异常

时间:2015-07-11 07:58:30

标签: ios objective-c nstimer

我遇到了NSTimeruserInfo的问题 在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属性会怎样?这会解决问题吗?为什么?为什么这个问题首先发生?

2 个答案:

答案 0 :(得分:1)

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

@property (nonatomic, copy) NSNumber *_id;

答案 1 :(得分:1)

由于employee.employee_id是一个对象,您需要使用NSNumber属性,这是默认值,因此请将strong声明更改为:

@property

使用@property (nonatomic) NSNumber *_id; 作为标识符是一个坏主意,因为_id是一个Objective-C关键字,您可能会在某些时候感到困惑。