什么可能导致从iphone OS3.0到iOS4.0的这种行为差异?

时间:2010-06-09 23:57:15

标签: iphone cocoa-touch ios4

在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;

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

我很难过为什么会这样,因为代码在之前的操作系统上运行并且自那以后没有改变(即使用以前的SDK编译的二进制文件也以相同的方式崩溃,但在OS3.0上没有崩溃) - 鉴于它是一种简单的属性方法。

有什么想法吗? NSError实现可能在发行版之间发生了变化,还是我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您是否曾在sendPost:消息中释放serverResponse?

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

- (ServerResponse*) initWithResponse:(NSURLResponse*)resp error:(NSError*)err data:(NSData*)serverReply
{   
    if (self = [super init])
    {
        // ....
    }
    return self;
}