2010-07-17 2 views
0

У меня есть эта очень простая программа, где я просто создаю объект и смотрю на счет сохранения.Objective-C: Почему мой показатель удержания не равен 1?

#import <Foundation/Foundation.h> 
#import "GeometryCalculator.h" 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    GeometryCalculator *calculator = [[GeometryCalculator alloc] init]; 
    NSLog(@"Counter: %d", [calculator retainCount]); 

    [calculator release]; 

     [pool drain]; 
     return 0; 
} 

Я ожидал, что мой retainCount быть 1, но это 16863520. Класс GeometryCalculator совершенно пуст. Нет методов, нет переменных экземпляра.

+1

Наследует ли ваш GeometryCalculator NSObject? – kennytm

+0

KennyTM: Если это не так, то калькулятор не будет отвечать на 'keepCount', и сообщение вызовет исключение, а не возвращает мусор. –

ответ

7

Вы проверяете это с включенной сборкой мусора. Результат retainCount не определен под сборкой мусора, но на практике он возвращает значение указателя для вашего объекта, потому что это самая быстрая неопределенная вещь (в данном случае 0x1015120).

(Trivia: вы также тестируете 32-битный процесс. Если это был 64-разрядный процесс, вы получили бы высокое слово указателя из-за того, что ссылается на тип, на который ссылается Питер. быть более низким значением.)

+0

Да, у меня включен сборщик мусора. Я играл с обстановкой накануне и полностью забыл об этом. Большое спасибо! – TalkingCode

0
+0

Как это помогает? Все, что он говорит, это «да», и это даже неправильный ответ. ('keepCount' is * not * полезен для обучения, потому что он так часто вводит в заблуждение.) –

3

правильный тип спецификатор %lu, не %d. Метод retainCount возвращает NSUInteger, который является беззнаковым и равен размеру long. Так же, практически, это эквивалентно unsigned long, для которого вы используете %lu. %d - int, который подписан и (по некоторым архитектурам) короче. Использование неверных спецификаторов типов - хороший способ получить неправильный вывод. Итак, посмотрите, исправляет ли исправление ваш результат.

Если это не так, то это, безусловно, головоломка.

Смежные вопросы