Правильный способ поместить NSString внутри NSMutableArray внутри метода - PullRequest
3 голосов
/ 03 марта 2011

Рассмотрим следующие коды

- (void) method1
{

list = [[NSMutableArray alloc] init];

NSString *f =[[NSString alloc] initWithCString: "f"];

 [list addObject: f];
}

- (void) method2...

список - это переменная экземпляра класса, мне нужно получить доступ ко всем переменным внутри списка в другом методе, например method2 , когда явыделить NSString в method1 , мне нужно сохранить его?Я обнаружил, что не нужно удерживать?Почему?

Ответы [ 3 ]

4 голосов
/ 03 марта 2011

Когда вы alloc что-то, вы уже являетесь владельцем, поэтому нет необходимости retain это.

Смотрите здесь для полной истории.

Ваш метод (и класс) на самом деле плохо написан в отношении управления памятью.Вы должны:

  1. освободить list перед выделением и назначением ему нового списка

  2. освободить list в dealloc method

  3. освободить строку после добавления ее в массив

Поэтому измените ваши методы на:

- (void) method1 {  
  [list release];
  list = [[NSMutableArray alloc] init];
  NSString *f = [[NSString alloc] initWithCString: "f"];
  [list addObject: f];
  [f release];
}

- (void) dealloc {
  [list release];
  // release other instance variables...
  [super dealloc];
}
0 голосов
/ 03 марта 2011

Вам не нужно сохранять его, поскольку вы являетесь владельцем, когда вы alloc получаете класс и получаете экземпляр.Вам действительно нужно выпустить его после добавления в NSMutableArray.При добавлении объектов в NSMutableArray он отправляет им сообщение retain и становится владельцем.

Также обратите внимание, что initWithCString устарела.Вместо этого используйте следующий шаблон, если вам нужно инициализировать из строки C:

[NSString stringWithCString:"f" encoding:NSUTF8StringEncoding];

Но если вы просто создаете постоянную строку NSString, просто используйте литерал.Он автоматически высвобождается и делает ваши намерения более ясными.т.е.:

list = [[NSMutableArray alloc] init]
[list addObject:@"f"];
0 голосов
/ 03 марта 2011

вам понадобится @ для этой строки @ "f"

и это охватывает проблему управления памятью NSMutableArray управление памятью

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