iPhone"算"挫折?

cod*_*key 3 iphone memory-management objective-c string-formatting ios

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

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

我错过了什么?

哦......如果有人想知道,这段代码只是我试图找出为什么我无法得到一个实际上在程序中其他地方重要的NSMutableArray的数量.

Dav*_*Liu 8

[mutableArray count]返回一个NSUInteger.在NSLog中,指定%@,这需要NSString.Obj-C不会自动将整数转换为字符串,因此您需要使用:

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

了解如何使用字符串格式.这是一个链接:http:
//developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1

您还发布了一个已经自动释放的对象.根据经验,不要在对象上调用release/autorelease,除非你自己也对它进行了alloc/retain/copy.大多数情况下,您从其他类方法获得的对象已经为您自动释放,因此您不应该再进行其他发布.

  • 实际上%@不需要NSString,它适用于任何objective-c对象,包括NSString. (3认同)
  • `%@`不仅适用于Objective-C对象,它也适用于CFTypeRef对象.对于Objective-C对象,使用发送`description`的结果(或`descriptionWithLocale:`,如果它存在),对于Core Foundation类型,它是调用`CFCopyDescription`的结果. (2认同)
  • %@不适用于NSUInteger,因为它不是对象.根据iPhone OS标题:​​---- #typedef unsigned int NSUInteger ---- (2认同)

Chr*_*per 5

不要在最后释放它!

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

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