Как обеспечить отсутствие утечки памяти для класса Objective-C, который вызывается многими другими классами - PullRequest
0 голосов
/ 09 октября 2009

У меня есть следующий класс контроллера, который будет выполнять различные задачи в зависимости от комбинации свойства flag и param. Значение этих двух свойств будет установлено многими другими классами, имеющими ссылку на этот контроллер. Вопрос в том, как каждому из вызывающих классов присваивать значение и когда они должны его освобождать, чтобы не было утечки памяти?

@interface SampleController {
    NSMutableArray *param;  
    NSString *flag;
}
@property (nonatomic, retain) NSMutableArray *param;
@property (nonatomic, retain) NSString *flag;
@end


@implementation SampleController
@synthesize param;
@synthesize flag;

- (id)init
{
   param = [[NSMutableArray alloc] initWithCapacity:0];
   flag = @"nothing";
}
@end

1 Ответ

0 голосов
/ 09 октября 2009

Ну, это зависит от того, как вы называете свой контроллер:

  1. в переменной экземпляра другого объекта: вы должны освободить ее в методе освобождения этого объекта
  2. в функции: вы должны освободить ее, когда она вам больше не нужна (например, удерживается другим объектом или она завершила работу в этой функции), если вы хотите вернуть ее, просто отправьте сообщение «autorelease» на он и NSAutoReleasePool сделают всю работу за вас.

Чтобы присвоить значение, вы можете

  1. установить изменяемый массив с помощью setParam: (* NSMutableArray) theArrayYouWantToReplaceYourArrayWith
  2. доступ к нему напрямую с помощью [[yourSampleController param] addObject: (id) objectYouWantToAdd] ...
  3. или более удобный: [yourSampleController.param addObject: (id) objectYouWantToAdd]

Сообщение addObject: здесь является примером, вы можете увидеть методы для изменения массива (удалить, отсортировать, ...) в ссылке на класс NSMutableArray.

Вы не сможете изменить вашу строку, так как это строка NSString, а не NSMutableString, но вы можете получить к ней доступ

  1. [yourSampleController getParam]
  2. [yourSampleController param]
  3. yourSampleController.param

Если вы хотите избежать утечек в целом, создайте свой проект с помощью инструмента «Инструмент» в режиме утечки и посмотрите на объекты, на которые есть утечки, если вы обнаружили объекты, которые объявлены в ваших функциях. Вы также можете проверить Clang Static Analyzer (бесплатный статический отладчик), что неплохо, если у вас много файлов.

Я надеюсь, что помог вам

Julien

...