2010-06-09 47 views
2

在iOS4上運行我的應用程序時,出現奇怪的EXC_BAD_ACCESS錯誤。這個應用在OS3.x上已經很穩定了 - 甚至沒有在代碼的這個區域(或者很多)看到崩潰日誌。從iPhone OS3.0到iOS4.0的行爲有什麼不同?

我跟蹤誤差降低到這個代碼:

主類:

- (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實現是否可以在不同版本之間進行更改,還是我錯過了某些明顯的東西?

回答

3

setter對新值調用[retain],對舊值調用[release]。其中一個必須是無效的(並且非零)才能導致訪問不良。

sendPost不初始化它的本地錯誤變量,如果它沒有被NSURLConnection設置,那麼它將包含垃圾。嘗試將錯誤初始化爲sendPost中的nil。

+0

hmm但是當我在調試器中通過它時,錯誤是事先沒有的。無論是在模擬器還是在設備上,也是如此。 – frankodwyer 2010-06-10 00:10:52

+0

這個技巧(我也初始化了響應局部變量)。 我希望NSURLConnection覆蓋這些 - 我猜我以前是幸運的,他們曾經是零,或者實現已經在4.0中改變了,NSURLConnection在設置out參數之前釋放舊值。 – frankodwyer 2010-06-10 00:24:20

1

你有沒有在sendPost:消息中釋放serverResponse?

你的init永遠不會調用它的父init。嘗試這樣的:

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

我沒有init方法,initWithResponse:方法是初始化方法。初始化本地變量似乎可以解決它(我曾預計NSUrlConnection會初始化它們 - 奇怪的是它一直在努力)直到現在爲止 而且是的ServerResponse泄露了我認爲 - 一個單獨的問題。 – frankodwyer 2010-06-10 10:22:35

相關問題