NSTimer userInfo Bad 访问异常
NSTimer userInfo Bad Access exception
我遇到了 NSTimer
和 userInfo
的问题。
在 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 关键字,您可能会在某些时候混淆自己。
我遇到了 NSTimer
和 userInfo
的问题。
在 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 关键字,您可能会在某些时候混淆自己。