Почему retainCount возвращает значение после вызова release? - PullRequest
0 голосов
/ 28 октября 2010

У меня есть следующий простой фрагмент кода:

NSMutableArray *array = [[NSMutableArray alloc] init];

    NSObject *o = [[NSObject alloc] init];
    NSObject *o1 = [[NSObject alloc] init];
    NSObject *o2 = [[NSObject alloc] init];

    [array addObject:o];
    [array addObject:o1];
    [array addObject:o2];
    NSLog(@"-------");
    NSLog(@"%d, %d, %d, %d\n", [o retainCount], [o1 retainCount], [o2
                                                                   retainCount], [array retainCount]);
    [array release];
    NSLog(@"%d, %d, %d, %d\n", [o retainCount], [o1 retainCount], [o2
                                                                   retainCount], [array retainCount]);
    [o release];
    [o1 release];
    [o2 release];
    NSLog(@"-------");
    NSLog(@"%d, %d, %d, %d\n", [o retainCount], [o1 retainCount], [o2
                                                                   retainCount], [array retainCount]);

в качестве вывода я получаю:

[Session started at 2010-10-27 18:00:59 +0200.]
2010-10-27 18:01:02.186 Questions[22463:207] -------
2010-10-27 18:01:02.187 Questions[22463:207] 2, 2, 2, 1
2010-10-27 18:01:02.188 Questions[22463:207] 1, 1, 1, 1
2010-10-27 18:01:02.188 Questions[22463:207] -------

и программа прерывается с помощью EXC_BAD_ACCESS.

мой вопрос следующий: я понимаю, что после вызова [release release] объекта массива больше не существует, верно?и то же самое для вызова release для других объектов, да?Если так, почему я не получаю EXC_BAD_ACCESS после вызова [array retainCount]?почему он возвращает любое значение?и почему вызов retainCount для других объектов вызывает EXC_BAD_ACCESS?

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 28 октября 2010

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

Если вы хотите получить retainCount от уже выпущенных объектов, вы должны проверить NSZombieEnabled (http://www.cocoadev.com/index.pl?NSZombieEnabled),, что приведет к тому, что объекты будут освобождены, но не освобождены.

2 голосов
/ 28 октября 2010

Поскольку вы выпустили array, а затем пытаетесь получить к нему доступ снова.

[array release]; // array is no longer in memory, therefore you can no longer use it.
[array retainCount]; // crash!

Даже если вы вызываете release для объекта, иногда этот объект может оставаться в памяти немного дольше. Я рекомендую вам установить любую переменную, которую вы можете повторно использовать на nil после ее освобождения.

[array release];
array = nil;
[array retainCount]; // no more crash 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...