gpt4 book ai didi

iphone - 这个对象是如何被过早释放的?

转载 作者:行者123 更新时间:2023-12-02 07:18:51 25 4
gpt4 key购买 nike

我收到了来自 Apple 的崩溃报告,我正在尝试确定发生了什么。我无法按照他们的步骤重新创建崩溃,并且在我的任何测试中都没有看到类似的崩溃。以下是崩溃报告的重要部分:

9   libobjc.A.dylib                 0x00004838 objc_exception_throw + 64
10 CoreFoundation 0x000a167c -[NSObject(NSObject) doesNotRecognizeSelector:] + 96
11 CoreFoundation 0x000491d2 ___forwarding___ + 502
12 CoreFoundation 0x00048f88 _CF_forwarding_prep_0 + 40
13 TheApp 0x0001cd28 -[Tumblelog initWithDictionary:] (Tumblelog.m:40)
14 TheApp 0x0001ef8c -[TumblrEngine userFromRequest:] (TumblrEngine.m:589)

在我看来,我的字典似乎过早发布了。在应用程序的大多数运行过程中,此代码路径会被多次调用,并且对我来说还没有崩溃,因此我确信我不会意外地将错误的对象发送到 initWithDictionary .

这是来自 TumblrEngine 的代码和Tumblelog .

// TumblrEngine.m
- (TumblrUser *)userFromRequest:(ASIHTTPRequest *)request{
NSData *data = [request responseData];
NSError *parseError = nil;
NSXMLDocument *doc = [[[NSXMLDocument alloc] initWithData:data options:NSXMLDocumentTidyXML error:&parseError] autorelease];
NSDictionary *dictionary = [doc toDictionary];
NSDictionary *userDict = [dictionary valueForKeyPath:kParseKeyPathUserInfo];
TumblrUser *user = [[TumblrUser alloc] initWithDictionary:userDict];
NSArray *tumblelogs = [dictionary valueForKeyPath:kParseKeyPathTumblelogsInfo];
NSMutableArray *userTumblelogs = [NSMutableArray array];
for(NSDictionary *tumblelogDictionary in tumblelogs){
Tumblelog *tumblelog = [[Tumblelog alloc] initWithDictionary:tumblelogDictionary]; //line 589
[userTumblelogs addObject:tumblelog];
[tumblelog release];
}
[user setTumblelogs:userTumblelogs];
return [user autorelease];

}

// Tumblelog.m
- (id)initWithDictionary:(NSDictionary *)aDictionary{
if((self = [super init])){
[self setAvatarURL:[aDictionary restURLForKey:kParseKeyTumblelogAvatarURL]]; //line 40
// this was the line that started the crash
}
return self;
}

我的主要问题是:你知道 aDictionary 是如何实现的吗?在它被创建到我尝试在 Tumblelog.m 中使用它之间的任何时间点被释放?

否则,我正在探索在 NSDictionary 上加载类别是否存在问题。当我直接将应用程序加载到我的三部测试手机(iPhone 4/iOS 4.1、iPhone 3GS/iOS 4.0.1、iPhone 3G/3.1.3)上时,效果很好。该应用程序崩溃的手机是 iPhone 4/iOS 4.1,与我的主要测试手机相同。

我唯一能想到的就是我发送给 Apple 的二进制文件中的某些内容可能已损坏。我怀疑这就是答案,因为这些二进制文件是经过校验的,但我在这里没有想法了。如果测试人员的手机再次崩溃,我不想重新提交。

最佳答案

这可能是一个线程问题(对象在另一个线程上释放),但对于上面的代码来说这似乎不太可能。

更有可能(正如 @imaginaryboy 所说)你并没有真正的字典。

更安全的循环如下所示。

for(id tumblelogDictionary in tumblelogs){
if ([tumblelogDictionary isKindOfClass:[NSDictionary class]]) {
Tumblelog *tumblelog = [[Tumblelog alloc] initWithDictionary:tumblelogDictionary]; //line 589
[userTumblelogs addObject:tumblelog];
[tumblelog release];
} else {
// Appropriate error handling and / or logging.
}
}

注意:我实际上还没有尝试编译这个。它可能有一两个拼写错误或语法错误。

关于iphone - 这个对象是如何被过早释放的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796341/

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