Установка указателей на ноль, target-c - PullRequest
2 голосов
/ 26 июля 2011

Я немного озадачен тем, что память указателей является новой для программирования. Поэтому я добавляю UIBarButtonItem на основе того, когда UITabBarController выбран следующим образом:

NSMutableArray *barItems = [[self.MainToolbar items] mutableCopy];
    if (_sortButton == nil) {
        _sortButton = [[UIBarButtonItem alloc] initWithTitle:@"Sort" style:UIBarButtonItemStyleBordered target:self action:@selector(sortButtonPressed:)];
        [barItems insertObject:_sortButton atIndex:0];
        [self.MainToolbar setItems:barItems];
        [_sortButton release];
    }

Я попытался удалить UIBarButton, проверив, равен ли _sortButton ноль, как это:

    if (_sortButton != nil) {
        // self.SortButton = nil;  // I NEEDED THIS
        NSMutableArray *barItems = [[self.MainToolbar items] mutableCopy];
        [barItems removeObjectAtIndex:0];
        [self.MainToolbar setItems:barItems];
    }

Это не сработало, пока я не добавил закомментированную строку self.SortButton = nil. Кто-нибудь может это объяснить? Я думал, что если я удалю _sortButton из массива, он будет неинициализирован, но я думаю, что это неправильно. Кажется, он все еще имеет ссылку в памяти, если вы не установите его на ноль. Это правильно? Спасибо.

1 Ответ

10 голосов
/ 26 июля 2011

Это классическая висящая указка проблема.

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

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

Вот макрос, который вам пригодится:

#define RELEASE_NIL(obj) [obj release], obj = nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...