iPhone“算”挫折?

时间:2010-05-26 23:14:50

标签: iphone objective-c ios memory-management string-formatting

好的,我知道我必须遗漏一些明显的东西。这是示例代码(当在viewDidLoad块中执行时,它会以静默方式崩溃...没有错误输出到调试控制台)。

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

我错过了什么?

哦......如果有人想知道,这段代码只是我想弄清楚为什么我不能得到一个NSMutableArray的计数,它实际上对程序中的其他地方很重要。

2 个答案:

答案 0 :(得分:8)

[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。大多数情况下,您从其他类方法获得的对象已经为您自动释放,因此您不应该再进行另一次发布。

答案 1 :(得分:5)

不要在最后发布

arrayWithCapacity:10会返回一个autorelease d对象,这意味着它会在以后自动释放。自己发布它意味着它将计入-1并且会发生不愉快的事情! (正如你所发现的那样)

作为一般规则,包含单词alloccopy的方法返回的对象必须由您释放,而不是其他人! (当然,除非你先保留它们)