Цель-C: Почему мой счет удержания не 1? - PullRequest
0 голосов
/ 17 июля 2010

У меня есть очень простая программа, в которой я просто создаю объект и просматриваю счет сохранения.

#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 полностью пуст. Нет методов, нет переменных экземпляра.

Ответы [ 3 ]

7 голосов
/ 17 июля 2010

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

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

3 голосов
/ 17 июля 2010

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

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

0 голосов
/ 17 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...