Почему NSNumber неправильно считает счет? - PullRequest
1 голос
/ 01 декабря 2011

Вот код сохранения счета.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    @autoreleasepool {

        NSNumber *number = [[NSNumber alloc]initWithInt:10];
        NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:0];

        NSLog(@"retain count : %d",[number retainCount]);

        [array addObject:number];
        NSLog(@"retain count : %d",[number retainCount]);

        [number release];
        NSLog(@"retain count : %d",[number retainCount]);

        [number release];
        NSLog(@"retain count : %d",[number retainCount]);

        [number release];
        NSLog(@"retain count : %d",[number retainCount]);
    }
    return 0;
}

Мой ожидаемый ответ -

retain count : 1
retain count : 2
retain count : 1
retain count : 0
and then error

, но на самом деле результат работы следующий:

[Switching to process 6363 thread 0x0]
2011-12-01 19:39:53.843 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.846 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.848 nsnumber[6363:707] retain count : -1

Я могу 'Я не понимаю этот результат.

Почему этот результат придет?

Ответы [ 4 ]

3 голосов
/ 01 декабря 2011

NSNumber возвращает единичные экземпляры для определенных чисел (я полагаю, что целые числа от 1 до 12 или что-то).

Вы никогда не должны полагаться на значение retainCount. В вашем коде или коде структуры может происходить любое количество вещей, которые могут изменить счет сохранения.

3 голосов
/ 01 декабря 2011

Не доверяйте значению сохранения количества.Тем более, что вы используете ARC!Следовать правилам.Вот и все.

1 голос
/ 02 декабря 2011

Тип возврата retainCount равен NSUInteger; это целое число без знака . Спецификатор формата %d предназначен для целого числа со знаком .

Какао использует NSUIntegerMax для представления количества бессмертных объектов - объектов, которые никогда не будут выпущены. По соображениям производительности он кэширует и повторно использует NSNumber объекты, представляющие маленькие целые числа - этот созданный вами NSNumber, очевидно, является одним из них и бессмертен.

Когда вы интерпретируете максимальное целое число без знака, как если бы оно было подписано (в арифметике дополнения до двух ), оно выглядит как -1.

Чтобы увидеть «истинное» значение, вы должны использовать спецификатор %lu, как указано в таблице, на которую я ссылался выше.

Однако, как правило, не следует полагаться на retainCount, чтобы предоставить вам какую-либо полезную информацию . Это задокументировано :

Поскольку любое количество объектов каркаса могло сохранить объект для хранения ссылок на него, в то время как пулы автоматического выпуска могут содержать любое количество отложенных выпусков на объекте, очень маловероятно, что вы сможете получить полезную информацию. информация из этого метода.

как бериллий уже отмечен .

1 голос
/ 01 декабря 2011

О retainCount

Этот метод обычно не имеет значения при отладке проблем управления памятью.Поскольку любое количество объектов каркаса могло сохранить объект для хранения ссылок на него, в то время как пулы автоматического выпуска могут содержать любое количество отложенных выпусков для объекта, маловероятно, что вы можете получить полезную информацию из этогоmethod.

См. также

http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/retainCount

Когда использовать -retainCount?

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