когда выпустить объект, который используется во всем классе? - PullRequest
2 голосов
/ 26 сентября 2011

Я знаю, что основное правило управления памятью в target-C заключается в том, что для каждого объекта, который вы делаете alloc, вам нужно его где-то освобождать.*

Скажите, что этот self.myArray используется в качестве источника данных UITableView, поэтому когда и где мне его выпустить?В сделке?Я предполагаю, что выпуск в dealloc соответствует сохранению, которое я установил в своем свойстве, поэтому где я должен выпустить

Ответы [ 3 ]

3 голосов
/ 26 сентября 2011

В вашем примере вам технически необходимо выпустить его дважды - один раз в dealloc и один раз сразу после установки свойства:

NSMutableArray *a = [[NSMutableArray alloc] init];
self.myArray = a;
[a release];

Причина этого заключается в том, что вы специально выделяете память в viewDidLoad, а затем также увеличиваете счет сохранения при установке свойства.

Чтобы избежать этого, используйте один из статических NSMutableArray конструкторов или используйте autorelease, т.е.

self.myArray = [[[NSMutableArray alloc] init] autorelease];

Кроме того, можно вообще обойти свойство:

myArray = [[NSMutableArray alloc] init];

Это позволило бы избежать дополнительного сохранения, генерируемого свойством (фактически вы могли бы избавиться от оператора свойства, если бы он использовался только локально).

1 голос
/ 26 сентября 2011

Если я хочу выставить NSMutableArray, я бы сделал это:

@interface NewPollViewController : UIViewController 
{
   NSMutableArray * myArray;
}

@property (nonatomic, readonly) NSMutableArray * myArray;

@implementation NewPollViewController
@synthesize myArray;

- (void) viewDidLoad
{
  [super viewDidLoad];
  self.myArray = [[NSMutableArray alloc] init];
}

- (void) dealloc
{
   [myArray release],myArray = nil;
}

Изменил свойство на readonly, потому что его изменяемый массив вы не хотите, чтобы другие классы изменяли этот массив, и вы правильно распределенывыпуская это.

0 голосов
/ 26 сентября 2011

В вашем случае я часто выпускаю его в viewDidUnload, а также в dealloc.

. Мне нравится сохранять зеркало относительно того, где выделена память.Когда это сделано в viewWillAppear, я выпускаю в viewWillDisappear.

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

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