gpt4 book ai didi

ios - 具有分配对象属性的 Objective-C EXC_BAD_ACCESS

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:34:08 27 4
gpt4 key购买 nike

下面的 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 代码,就像在这种情况下一样,或者来 self 的 application:didRegisterForRemoteNotificationsWithDeviceToken 。我的 deviceToken 确实没有AppDelegate 中初始化,所以它的 assign 语义很明显我正在尝试取消引用垃圾。但是 nil 检查如何导致对 objc_retain 的调用?

显然值得尝试将 deviceToken 初始化为 nil,或更新其内存管理语义。代码中还值得注意的是一些 bool 值,其目的似乎是保护对 initializeWebServices 的调用,并且可能管理不善。

但我不知道如何重现这个错误。

最佳答案

属性(property)申报错误;它应该使用 strongcopy 属性而不是 assign:

@property (nonatomic, strong) NSString* deviceToken; 

使用 assign 意味着对象没有被正确保留,因此异常。

关于ios - 具有分配对象属性的 Objective-C EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36655947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com