powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Objective-C и retainCount, помогите разобраться
7 сообщений из 7, страница 1 из 1
Objective-C и retainCount, помогите разобраться
    #37697524
Здравствуйте, впервые оставляю сообщение на форуме с вопросом, не ругайте за оформление исходника, не нашел Objective-C в списке "Выделение исходников", поэтому поставил C++.

Мой вопрос связан с управлением памятью в Objective-C. Что я делаю: в исходнике создается изменяемый массив (array), затем выводится его счетчик ссылок (равен 1). Далее я создаю второй массив (array2) и записываю первым элементом array2 массив array, проверяю счетчик ссылок array (равен 2). Затем я удаляю из array2 элемент с индексом 0 (array) и вывожу счетчик ссылок (равен 1), пока все верно и все понятно, так и должно быть. Но затем я уменьшаю счетчик ссылок array на 1 ([array release]), после чего объект должен удалиться - как пишут в книгах "если счетчик ссылок равняется 0, то система понимает, что объект нужно удалить и вызывает метод dealloc". Но ничего подобного не происходит, array не равен NULL после всех операций, да и счетчик ссылок по-прежнему равен единице. К тому же вызвать метод dealloc нельзя (ошибка: pointer being freed was not allocated - указатель свободен). Если указатель свободен, то он не должен быть связан с объектом, но я вызываю [array retainCount] и NSLog выводит 1 ! Что происходит? Расскажите, пожалуйста.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:100];
NSLog(@"array retain count = %lu", (unsigned long)[array retainCount]); //выводит 1
    
NSMutableArray *array2 = [[NSMutableArray alloc] initWithCapacity:100];
[array2 addObject:array]; //увеличиваем счечик ссылок array на 1
    
NSLog(@"array retain count after adding to array2: %lu", (unsigned long)[array retainCount]); //выводит 2
    
[array2 removeObjectAtIndex:0]; //уменьшаем счетчик ссылок на 1
NSLog(@"array after delete from array2: %lu", (unsigned long)[array retainCount]); //выводит 1

[array release]; //уменьшаем счетчик ссылок на 1 (теперь счетчик ссылок должен быть равен 0)
    
if (array == NULL)
    NSLog(@"NSMutableArray is null after two retains!"); //пропускается (array != NULL)
else
    NSLog(@"NSMutableArray after two retains: %lu", [array retainCount]); //выводит 1
...
Рейтинг: 0 / 0
Objective-C и retainCount, помогите разобраться
    #37697526
Забыл сказать, весь код находится внутри пула автоосвобождения (NSAutoreleasePool *pool = ...).
Кстати, даже если проверить array на значение NULL после [pool drain], то array все равно не равен NULL.
Пугает меня всё это :)
...
Рейтинг: 0 / 0
Objective-C и retainCount, помогите разобраться
    #37697604
###
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Creative russian user,

Перечитай книжку заново... Ты не до конца разобрался.
Не поймешь своей ошибки - подскажу.

Но самому понять ведь приятнее, не так ли?
...
Рейтинг: 0 / 0
Objective-C и retainCount, помогите разобраться
    #37697844
Безусловно =)

Я перечитал главу "Управление памятью", в которой наткнулся на такое предложение: "Каждый объект в Objecive-C связывается с определенной целочисленной переменной - счетчиком ссылок". Получается, что счетчик ссылок привязан к объекту, но не удаляется вместе с ним? Но если это так, то все равно он должен уменьшаться до нуля.

Возможно я не ту книгу взял в руки, моя называется "Марк Далримпл, Скотт Кнастер - Objective-C 2.0 и программирование для Mac 2010". Посоветуйте, пожалуйста, качественную литературу, если не затруднит.

Я также написал код, приведенный в книге:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#import <Foundation/Foundation.h>

@interface RetainCount : NSObject

@end

@implementation RetainCount

-(void) dealloc {
    NSLog(@"Объект уничтожен! Счетчик ссылок равен нулю");
    [super dealloc];
}

@end



А затем проверил его:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    NSLog(@"RETAINCOUNT");
    RetainCount *rc = [[RetainCount alloc] init]; //счетчик ссылок равен 1
    NSLog(@"RetainCount: %lu", [rc retainCount]); //выводит 1
    [rc retain];                                  //счетчик ссылок равен 2
    NSLog(@"RetainCount: %lu", [rc retainCount]); //выводит 2
    [rc release];                                 //счетчик ссылок равен 1
    NSLog(@"RetainCount: %lu", [rc retainCount]); //выводит 1
    [rc release];                                 //счетчик ссылок равен 0. Выводит "Объект уничтожен! Счетчик ссылок равен нулю"
    NSLog(@"RetainCount: %lu", [rc retainCount]); //опять выводит 1
    NSLog(@"RETAINCOUNT");



В консоли:

RETAINCOUNT
RetainCount: 1
RetainCount: 2
RetainCount: 1
Объект уничтожен! Счетчик cсылок равен нулю
RetainCount: 1
RETAINCOUNT


Не понятно :)
...
Рейтинг: 0 / 0
Objective-C и retainCount, помогите разобраться
    #37698446
###
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Creative russian user,

Да все просто - ты посылаешь сообщение уже не существующему объекту. Результат неопределен (просто получаешь "мусор" из стека)...

ЗЫ. Кстати, retainCount возвращает int, поэтому форматер в NSLog должен быть %d. (Не путай си-шные типы данных с классами Objective-C)
...
Рейтинг: 0 / 0
Objective-C и retainCount, помогите разобраться
    #37698632
###
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Creative russian user,

Извини - с retainCount ошибся (давно его не пользовал), он действительно NSUinteger
...
Рейтинг: 0 / 0
Objective-C и retainCount, помогите разобраться
    #37698764
Аааа, все, я понял, спасибо!)

А меня чего-то переклинило)) Очень хотелось увидеть 0 в retainCount :D
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Objective-C и retainCount, помогите разобраться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]