下面的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
,或更新其内存管理语义。代码中还值得注意的是一些布尔值,其意图似乎是保护对initializeWebServices
的调用,并且可能管理不善。
但我不知道如何重现这个错误。
答案 0 :(得分:4)
该财产被误认;它应该使用strong
或copy
属性而不是assign
:
@property (nonatomic, strong) NSString* deviceToken;
使用assign
表示对象未被正确保留,因此例外。