iPhone "считает" разочарования? - PullRequest
3 голосов
/ 27 мая 2010

Хорошо, я знаю, что, должно быть, здесь что-то упущено. Вот пример кода (который при выполнении в блоке viewDidLoad молча вылетает ... без вывода ошибок на консоль отладки).

NSMutableArray *bs = [NSMutableArray arrayWithCapacity:10];
[bs addObject:[NSNumber numberWithInteger: 2]];
NSLog(@"%@", [bs count]);
[bs release];

Чего мне не хватает?

О ... и в случае, если кому-то интересно, этот код просто я пытаюсь выяснить, почему я не могу получить счетчик NSMutableArray, который действительно имеет значение где-то еще в программе.

Ответы [ 2 ]

8 голосов
/ 27 мая 2010

[mutableArray count] возвращает NSUInteger. В вашем NSLog вы указываете% @, для которого требуется строка NSString. Obj-C не выполняет автоматическое преобразование целых чисел в строки, поэтому вам нужно использовать:

NSLog(@"%u", [bs count]); // Uses %u specifier which means unsigned int

Узнайте, как использовать форматирование строки. Вот ссылка:
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1

Вы также выпускаете объект, который уже был автоматически освобожден. Как правило, никогда не вызывайте release / autorelease для объекта, если только вы сами не сделали alloc / retain / copy для него. В большинстве случаев объекты, которые вы получаете от других методов класса, уже были автоматически выпущены для вас, поэтому вам не следует делать еще один выпуск.

5 голосов
/ 27 мая 2010

Не отпускайте его в конце !

arrayWithCapacity:10 возвращает объект autorelease d, что означает, что он будет автоматически освобожден позже. Отпустив его самостоятельно, вы увидите, что его счет увеличится до -1, и случится несчастье! (Как вы обнаружили)

Как правило, объекты, возвращаемые методами, содержащими слова alloc или copy, должны быть выпущены вами, но не другими! (Если, конечно, вы не сохраните их первыми)

...