在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實現是否可以在不同版本之間進行更改,還是我錯過了某些明顯的東西?
hmm但是當我在調試器中通過它時,錯誤是事先沒有的。無論是在模擬器還是在設備上,也是如此。 – frankodwyer 2010-06-10 00:10:52
這個技巧(我也初始化了響應局部變量)。 我希望NSURLConnection覆蓋這些 - 我猜我以前是幸運的,他們曾經是零,或者實現已經在4.0中改變了,NSURLConnection在設置out參數之前釋放舊值。 – frankodwyer 2010-06-10 00:24:20