【问题标题】:Memory error when asking for the count of a NSMutableArray instance询问 NSMutableArray 实例的计数时出现内存错误
【发布时间】:2011-12-20 09:49:16
【问题描述】:
arrayOfBookViews = [[NSMutableArray alloc] init];
BookView *book1 = [[BookView alloc] init];
[arrayOfBookViews addObject:book1];
BookView *book2 = [[BookView alloc] init];
[arrayOfBookViews addObject:book2];
NSLog(@"%@",arrayOfBookViews);
NSLog(@"%@",arrayOfBookViews.count);

运行这段代码给了我: ( "", “” ) 这是由于倒数第二行。最后一行给我一个 exc_bad_access 内存错误。由于数组及其对象已正确分配和初始化,我不明白为什么询问数组的计数会给我带来内存问题。我目前正在使用 xcode 4 在这个程序中使用自动引用计数。

请解释为什么代码中的最后一行会产生内存错误。谢谢。

【问题讨论】:

  • 不确定是否导致内存泄漏,但 arrayOfBookViews.count 返回一个 int,尝试 %i 而不是 %@。

标签: objective-c memory error-handling count nsmutablearray


【解决方案1】:

arrayOfBookViews.count 返回一个NSUIntegerNSUInteger 不是一个对象,它是一个原语。 %@ 格式说明符只是在传递给它的对象上调用 description,因此您尝试在无效的原语上调用方法。

将日志更改为NSLog(@"%d",arrayOfBookViews.count);,你会得到你想要的结果。

【讨论】:

  • 天哪,我犯了一个多么愚蠢的错误。非常感谢你们。
  • 你需要一个演员来确保它完全安全。
【解决方案2】:

您试图打印int 值。为此使用%d

NSLog(@"%d",arrayOfBookViews.count);

【讨论】:

  • 如果你想安全,你应该将计数转换为int,因为在 64 位 NSUInteger 上是unsigned long
  • 如果您有一个包含足够对象的数组来解决这个问题,那么您就会遇到更大的问题。
  • @JeremyP,感谢您的正确,是的,我知道这一点。我只是说%d格式,通常与int类型一起使用。
【解决方案3】:

请检查 NSArray 的 -count 方法的返回类型。你会发现它是一个NSUInteger,它是unsigned intunsigned long 的typedef,它是标准C 类型。您应该在格式说明符中使用%u%lu

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2014-12-12
    相关资源
    最近更新 更多