Когда выпускают методы локальных переменных в Obj-C - PullRequest
3 голосов
/ 14 августа 2011

Я занимаюсь разработкой приложения для iPhone, и я только что создал этот метод (он находится в одноэлементном классе):

- (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_dict было NSDictionary *data_dict = [[NSDictionary alloc] init], когда я должен его выпустить?

ОБНОВЛЕНИЕ 2

enter image description here

В звонилке у меня есть это:

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

и выводится консоль отладки:

retain count: 2
  • Почему «Xcode Analyze» говорит мне эти строки?
  • И почему счет сохранения равен 2?

Ответы [ 3 ]

6 голосов
/ 14 августа 2011

В общем, хорошо освобождать объекты, которые вам больше не нужны.Но помните - только вещи, которые имеют alloc, new или copy в своей инициализации, должны быть освобождены.В противном случае они уже автоматически высвобождены.

Итак, можно освободить синтаксический анализатор, не в порядке, чтобы освободить запрос, не в порядке, чтобы освободить ответ, хорошо, чтобы освободить json_string.

4 голосов
/ 14 августа 2011
SBJsonParser *parser = [[SBJsonParser alloc] init];

Вы вызвали init, затем у вас есть экземпляр, и вам нужно его освободить.

NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:http://example.org/last/]];

Вы вызвали метод класса, который возвращает автоматически выпущенный экземпляр, который будет добавлен в опрос autorelease.

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];
2 голосов
/ 14 августа 2011

Правильно выпускать parser и json_string, потому что они создаются с помощью методов, содержащих "alloc". Неправильно выпускать другие, потому что они автоматически освобождены.

В этом методе вам никогда не придется выпускать data_dict, поскольку он автоматически выпущен.

Пожалуйста, прочитайте Правила управления памятью Objective-C .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...