【问题标题】:iPhone "count" frustrations?iPhone“算”挫折?
【发布时间】:2011-02-24 10:34:18
【问题描述】:

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

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

我错过了什么?

哦...如果有人想知道,这段代码只是我想弄清楚为什么我无法获得程序中其他地方真正重要的 NSMutableArray 的计数。

【问题讨论】:

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


    【解决方案1】:

    [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,除非您自己也对其进行了分配/保留/复制。大多数情况下,您从其他类方法获得的对象已经为您自动释放,因此您不应该再次发布。

    【讨论】:

    • 其实%@不需要NSString,它适用于任何objective-c对象,包括NSString。
    • %@ 不仅仅适用于 Objective-C 对象,它也适用于 CFTypeRef 对象。对于 Objective-C 对象,使用发送description 的结果(如果存在则使用descriptionWithLocale:),对于Core Foundation 类型,它是调用CFCopyDescription 的结果。
    • %@ 不适用于 NSUInteger,因为它不是对象。根据 iPhone OS 标头:---- #typedef unsigned int NSUInteger ----
    【解决方案2】:

    不要在最后释放它

    arrayWithCapacity:10 返回一个autoreleased 对象,这意味着它稍后会自动释放。自己释放它意味着它的计数将转到-1 并且会发生不愉快的事情! (正如你所发现的)

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

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多