Objective-C простой вопрос памяти - PullRequest
1 голос
/ 28 сентября 2011

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

viewcontroller.m

@interface MemoryTestViewController : UIViewController
{
    NSMutableArray *array;
}

@end

в моей реализации

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *aux = [[NSMutableArray alloc] initWithCapacity:1];
    array = aux;
    [aux release];
    // Do i have to do array release?
}

Нужно ли где-нибудь освобождать мой массив переменных? Теоретически я не выделил эту переменную ... Я проверяю утечки памяти, и даже если я ничего не выпускаю, инструменты не обнаруживают утечки.

Ответы [ 4 ]

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

Вы уже освободили массив с [aux release]; - у вас фактически есть проблема, противоположная утечке: чрезмерный выпуск.

Назначения в Objective-C - это просто назначения указателей; нет копирования или автоматического управления памятью . Когда вы говорите array = aux;, array теперь указывает на тот же объект, что и aux. Если вы затем избавитесь от aux, освободив его (и, следовательно, позволив ему освободиться), array больше ни на что не указывает. *

У вас есть несколько способов исправить это:

  1. (Простейший) Присвойте вновь созданный массив непосредственно array:

    array = [[NSMutableArray alloc] initWithCapacity:1];

    Это дает вам право собственности на новый массив под именем array. Не отпускайте его, пока не закончите (возможно, в dealloc; конечно, не в этом методе).

  2. (Наилучший) Создайте объявленное свойство для array и предоставьте этому механизму управление памятью для вас:


@interface MemoryTestViewController : UIViewController
{
    NSMutableArray *array;  
}  

@property (copy, nonatomic, setter=setArrayByMutableCopy) NSMutableArray * array;
@end

@implementation MemoryTestViewController
@synthesize array;

// Properties can't automatically make mutable copies, so you need to create
// your own setter method.
- (void) setArrayByMutableCopy: (NSMutableArray *)newArray {
    NSMutableArray * tmp = [newArray mutableCopy];
    [array release];
    array = tmp;
}
...

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

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

Нет, вам не нужно выпускать. Все, что вам нужно сделать, это присвоить указатель aux вашей переменной array. array недействителен в тот момент, когда вы отпускаете aux. Это, вероятно, не так, как задумано. Если вы хотите работать с array, вам придется сохранить его.

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

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

alloc поднял счетчик удержания до 1 и [aux release] установил его на 0

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

Вы должны добавить свойство:

@ свойство (неатомное, сохраняемое) NSMutableArray * array;

и более поздних версий в вашем viewDidLoad:

// неправильно, утечки:self.array = [[NSMutableArray alloc] initWithCapacity: 1];

array = [[NSMutableArray alloc] initWithCapacity: 1];

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

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