下面的 delegate.deviceToken
表达式有时会抛出一个错误的指针取消引用,显然是在 objc_retain()
之外。
MyWebServices.m:
@implementation MyWebServices
+ (void)initializeWithCompletionBlock:(void (^) (id data))completionBlock withErrorBlock:(void (^)(NSError* error))errorBlock {
AppDelegate* delegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
if (delegate.deviceToken == nil) { // MyWebServices.m:29
...
}
...
}
AppDelegate 像这样声明
deviceToken
:@property (nonatomic, assign) NSString* deviceToken; // #NotMyCode
引用 崩溃报告 :
Code Type: ARM-64 (Native)
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000f434c4388
Triggered by Thread: 0
0 libobjc.A.dylib 0x0000000180a940b0 objc_retain + 16 (objc-object.h:341)
1 MyApp 0x0000000100054f98 +[MyWebServices initializeWithCompletionBlock:withErrorBlock:] + 200 (MyWebServices.m:29)
2 MyApp 0x000000010003b97c -[AppDelegate initializeWebServices] + 224 (AppDelegate.m:380)
3 MyApp 0x00000001000b123c __47-[AFNetworkReachabilityManager startMonitoring]_block_invoke + 132 (AFNetworkReachabilityManager.m:199)
对
-[AppDelegate initializeWebServices]
的调用可以来自 AFNetworkReachabilityManager
代码,就像在这种情况下一样,或者来自我的 application:didRegisterForRemoteNotificationsWithDeviceToken
。我的 deviceToken
确实没有在 AppDelegate
中初始化,因此使用它的 assign
语义很明显我试图取消引用垃圾。但是 nil 检查如何导致对 objc_retain
的调用?显然,尝试将
deviceToken
初始化为 nil
或更新其内存管理语义是值得的。代码中还值得注意的是一些 bool 值,其意图似乎是保护对 initializeWebServices
的调用,并且可能管理不善。但我不知道如何重现这个错误。
最佳答案
属性(property)申报错误;它应该使用 strong
或 copy
属性而不是 assign
:
@property (nonatomic, strong) NSString* deviceToken;
使用
assign
意味着对象没有被正确保留,因此是异常(exception)。关于ios - 具有分配对象属性的 Objective-C EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36655947/