2

在 iOS4 上运行我的应用程序时出现奇怪的 EXC_BAD_ACCESS 错误。一段时间以来,该应用程序在 OS3.x 上的表现相当稳定 - 甚至在这个代码区域(或很多)中都没有看到崩溃日志。

我已将错误跟踪到此代码:

主类:

- (void) sendPost:(PostRequest*)request {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSURLResponse* response;
    NSError* error;
    NSData *serverReply = [NSURLConnection sendSynchronousRequest:request.request returningResponse:&response error:&error];

    ServerResponse* serverResponse=[[ServerResponse alloc] initWithResponse:response error:error data:serverReply]; 

    [request.objectToNotifyWhenDone performSelectorOnMainThread:request.targetToNotifyWhenDone withObject:serverResponse waitUntilDone:YES];

    [pool drain];
}

(注意:sendPost 每次调用都在单独的线程上运行。PostRequest 只是一个封装请求的类和一个在完成时通知的选择器)

服务器响应.m:

@synthesize response;
@synthesize replyString;
@synthesize error;
@synthesize plist;

- (ServerResponse*) initWithResponse:(NSURLResponse*)resp error:(NSError*)err data:(NSData*)serverReply {
    self.response=resp;
    self.error=err;
    self.plist=nil;
    self.replyString=nil;

    if (serverReply) {
        self.replyString = [[[NSString alloc] initWithBytes:[serverReply bytes] length:[serverReply length] encoding: NSASCIIStringEncoding] autorelease];
        NSPropertyListFormat format;
        NSString *errorStr;
        plist = [NSPropertyListSerialization propertyListFromData:serverReply mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorStr];
    }

    return self;
}

服务器响应.h:

@property (nonatomic, retain) NSURLResponse* response;
@property (nonatomic, retain) NSString* replyString;
@property (nonatomic, retain) NSError* error;
@property (nonatomic, retain) NSDictionary* plist;

- (ServerResponse*) initWithResponse:(NSURLResponse*)response error:(NSError*)error data:(NSData*)serverReply;

这确实会因线路中的错误访问而崩溃:

self.error=err;

...即在合成属性设置器中!

我不知道为什么会这样,因为代码在以前的操作系统上工作并且从那以后没有改变(即使使用以前的 SDK 编译的二进制文件也以同样的方式崩溃,但在 OS3.0 上没有) - 并给出了它是一个简单的属性方法。

有任何想法吗?NSError 实现是否在版本之间发生了变化,还是我遗漏了一些明显的东西?

4

2 回答 2

3

setter 在新值上调用 [retain],在旧值上调用 [release]。其中之一必须是无效的(并且非零)才能导致错误的访问。

sendPost 不会初始化它的本地错误变量,如果它不是由 NSURLConnection 设置的,那么它将包含垃圾。尝试在 sendPost 中将错误初始化为零。

于 2010-06-10T00:03:25.970 回答
1

你有没有在 sendPost: 消息中释放 serverResponse?

你的 init 从不调用它的父 init。尝试类似:

- (ServerResponse*) initWithResponse:(NSURLResponse*)resp error:(NSError*)err data:(NSData*)serverReply
{   
    if (self = [super init])
    {
        // ....
    }
    return self;
}
于 2010-06-10T00:26:36.343 回答