在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只是一个封装请求的类,而选择器则在完成时通知)

ServerResponse.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;
}


ServerResponse.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;


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

考虑到代码在以前的OS上可以使用并且此后没有更改(即使使用以前的SDK编译的二进制文件也以相同的方式崩溃,但在OS3.0上却崩溃),我对此感到困惑。是一种简单的属性方法。

有任何想法吗? NSError实现在发行版之间可能已更改,或者我缺少明显的地方吗?

最佳答案

设置器对新值调用[retain],对旧值调用[release]。其中之一必须是无效的(并且不是非零),以导致错误的访问。

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

07-28 10:37