首先,我想首先说我是Objective C和iPhone世界的初学者,到目前为止我非常喜欢它,它非常有趣。
我来自PHP世界,并尝试采用一些非常不同的Objective C概念,例如需要释放自己的对象以避免内存泄漏。
但我遇到一个小问题,当我在函数结束时发布多个变量时,应用程序由于某种原因崩溃并出现EXC_BAD_ACCESS
错误。我确定它的东西小而且愚蠢,但我有点无能为力。
感谢您的指导,这是我的代码:
+ (id) getJsonFromURL: (NSURL *)url withQueryString: (NSString *)queryString withMethod: (NSString *)HTTPMethod error: (NSError **)outError{
// Initialize request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSData *requestData = [NSData dataWithBytes:[queryString UTF8String] length: [queryString length]];
// Set request data and method
[request setHTTPMethod:HTTPMethod];
[request setHTTPBody:requestData];
// Perform request
NSURLResponse *uResp = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&uResp error:nil];
// Make sure HTTP Request was successful (HTTP Code 200)
NSInteger httpStatus = [((NSHTTPURLResponse *)uResp) statusCode];
if(httpStatus != 200){
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[userInfo setValue:[NSString stringWithFormat:@"The requested URL could not be read (HTTP Code: %d)", httpStatus] forKey: NSLocalizedDescriptionKey];
}[NSException raise:@"MerchGuru.BadURL" format:@"The URL couldn't be read (HTTP Code: %d)", httpStatus];
// Decode JSON Output
NSError *jsonError = nil;
id respData = [[CJSONDeserializer deserializer] deserialize:returnData error:&jsonError];
if(jsonError != nil){
if(outError != nil){
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[userInfo setValue:@"The JSON Output provided isn't valid JSON!" forKey:NSLocalizedDescriptionKey];
*outError = [NSError errorWithDomain:@"com.freak4pc.merchguru" code:6001 userInfo: userInfo];
[userInfo release];
NSLog(@"%@", [*outError localizedDescription]);
}
[respData release];
[jsonError release];
[returnData release];
[uResp release];
[requestData release];
[request release];
return nil;
}else{
[respData release];
[jsonError release];
[returnData release];
[uResp release];
[requestData release];
[request release];
return respData;
}
}
谢谢:) 晒。
答案 0 :(得分:3)
你不应该release
你不拥有的东西。如果您在其上调用了alloc
或retain
,那么您只拥有一些内容。在您的示例中,您应该只发布request
答案 1 :(得分:3)
您必须release
自己alloc
自己做了什么。在这里,您只分配了request
,因此您必须只发布request
。所有其他变量都是使用便捷方法创建的,因此它们是自动释放的。
答案 2 :(得分:1)
您只能发布您正在创建的对象。
您的代码中有些对象是自动释放的,而EXC_BAD_ACCESS来自您释放这些对象。
从上面的代码看,您似乎只需要释放“请求”对象。