[英]When release methods local variables in Obj-C
我正在開發一個 iPhone 應用程序,我剛剛創建了這個方法(它在 singleton 類中):
- (NSDictionary *)getLastPosts
{
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:http://example.org/last/]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSDictionary *data_dict = [parser objectWithString:json_string error:nil];
// release stuff
[parser release];
[request release];
[response release];
[json_string release];
return data_dict;
}
我是新手 obj-c 開發人員,所以我不確定這兩件事:
data_dict
?更新 1
如果data_dict
是NSDictionary *data_dict = [[NSDictionary alloc] init]
我什么時候應該釋放它?
更新 2
在來電者中,我有這個:
- (void)callerMethod
{
NSDictionary *tmpDict = [mySingleton getLastPosts];
NSLog(@"retain count: %d", [tmpDict retainCount]);
}
調試控制台打印:
retain count: 2
一般來說,最好釋放不再需要的對象。 但請記住——只有在初始化時具有alloc
、 new
或copy
的東西才需要被釋放。 否則它們已經自動發布。
所以,可以釋放解析器,不可以釋放請求,不可以釋放響應,可以釋放json_string。
SBJsonParser *parser = [[SBJsonParser alloc] init];
您調用了 init,然后您擁有該實例並且您需要釋放它。
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:http://example.org/last/]];
您調用了一個 class 方法,該方法返回一個自動釋放的實例,該實例將被添加到自動釋放輪詢中。
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
自動釋放。
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
你調用了 init,你需要釋放它。
NSDictionary *data_dict = [parser objectWithString:json_string error:nil];
返回實例,自動釋放。
因此,您只需要釋放其中兩個:
[parser release];
[json_string release];
如果NSDictionary *data_dict = [[NSDictionary alloc] init]
那么你需要自己自動釋放它:約定是方法返回的任何實例都是自動釋放的。
順便說一句,通過自動釋放它,您可以確保它在自動釋放池被清空之前可用(除非您在其上調用釋放)。
要自動釋放它:
return [data_dict autorelease];
釋放parser
和json_string
是正確的,因為它們是使用包含“alloc”的方法創建的。 釋放其他是不正確的,因為它們是自動釋放的。
您不必在此方法中釋放data_dict
,因為它是自動釋放的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.