|
|
|
Objective-C и retainCount, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, впервые оставляю сообщение на форуме с вопросом, не ругайте за оформление исходника, не нашел 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2012, 02:12 |
|
||
|
Objective-C и retainCount, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Забыл сказать, весь код находится внутри пула автоосвобождения (NSAutoreleasePool *pool = ...). Кстати, даже если проверить array на значение NULL после [pool drain], то array все равно не равен NULL. Пугает меня всё это :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2012, 02:22 |
|
||
|
Objective-C и retainCount, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Creative russian user, Перечитай книжку заново... Ты не до конца разобрался. Не поймешь своей ошибки - подскажу. Но самому понять ведь приятнее, не так ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2012, 11:29 |
|
||
|
Objective-C и retainCount, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Безусловно =) Я перечитал главу "Управление памятью", в которой наткнулся на такое предложение: "Каждый объект в Objecive-C связывается с определенной целочисленной переменной - счетчиком ссылок". Получается, что счетчик ссылок привязан к объекту, но не удаляется вместе с ним? Но если это так, то все равно он должен уменьшаться до нуля. Возможно я не ту книгу взял в руки, моя называется "Марк Далримпл, Скотт Кнастер - Objective-C 2.0 и программирование для Mac 2010". Посоветуйте, пожалуйста, качественную литературу, если не затруднит. Я также написал код, приведенный в книге: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. А затем проверил его: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. В консоли: RETAINCOUNT RetainCount: 1 RetainCount: 2 RetainCount: 1 Объект уничтожен! Счетчик cсылок равен нулю RetainCount: 1 RETAINCOUNT Не понятно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2012, 16:32 |
|
||
|
Objective-C и retainCount, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Creative russian user, Да все просто - ты посылаешь сообщение уже не существующему объекту. Результат неопределен (просто получаешь "мусор" из стека)... ЗЫ. Кстати, retainCount возвращает int, поэтому форматер в NSLog должен быть %d. (Не путай си-шные типы данных с классами Objective-C) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2012, 10:14 |
|
||
|
Objective-C и retainCount, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Creative russian user, Извини - с retainCount ошибся (давно его не пользовал), он действительно NSUinteger ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2012, 12:20 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37698764&tid=1342382]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 480ms |

| 0 / 0 |
