好的,我知道我必须遗漏一些明显的东西。这是示例代码(当在viewDidLoad块中执行时,它会以静默方式崩溃...没有错误输出到调试控制台)。
NSMutableArray *bs = [NSMutableArray arrayWithCapacity:10];
[bs addObject:[NSNumber numberWithInteger: 2]];
NSLog(@"%@", [bs count]);
[bs release];
我错过了什么?
哦......如果有人想知道,这段代码只是我想弄清楚为什么我不能得到一个NSMutableArray的计数,它实际上对程序中的其他地方很重要。
答案 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
并且会发生不愉快的事情! (正如你所发现的那样)
作为一般规则,包含单词alloc
或copy
的方法返回的对象必须由您释放,而不是其他人! (当然,除非你先保留它们)