簡體   English   中英

當在 Obj-C 中釋放方法局部變量時

[英]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 開發人員,所以我不確定這兩件事:

  • 方法末尾的四個變量發布是否正確?
  • 應該什么時候發布 NSDictionary data_dict

更新 1

如果data_dictNSDictionary *data_dict = [[NSDictionary alloc] init]我什么時候應該釋放它?

更新 2

在此處輸入圖像描述

在來電者中,我有這個:

- (void)callerMethod
{
    NSDictionary *tmpDict = [mySingleton getLastPosts];
    NSLog(@"retain count: %d", [tmpDict retainCount]);
}

調試控制台打印:

retain count: 2
  • 為什么“Xcode Analyze”告訴我這些行?
  • 為什么保留計數是 2?

一般來說,最好釋放不再需要的對象。 但請記住——只有在初始化時具有allocnewcopy的東西才需要被釋放。 否則它們已經自動發布。

所以,可以釋放解析器,不可以釋放請求,不可以釋放響應,可以釋放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];

釋放parserjson_string是正確的,因為它們是使用包含“alloc”的方法創建的。 釋放其他是不正確的,因為它們是自動釋放的。

您不必在此方法中釋放data_dict ,因為它是自動釋放的。

請閱讀Objective-C memory 管理規則

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM