【问题标题】:NSMutableArray's count method causes a bad access error?NSMutableArray 的 count 方法导致访问错误?
【发布时间】:2011-06-18 20:42:34
【问题描述】:

我看到一些类似的问题,但没有简单的答案。在我在实际项目中实际使用它们之前,我只是在玩弄 NSMutableArray 以了解它们。出于某种原因,当我尝试对数组调用 count 时,它给了我一个 EXC_BAD_ACCESS 错误,我不知道为什么。

    - (void) applicationDidFinishLaunching:(UIApplication*)application 
{   
    // Create window and make key
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [_window makeKeyAndVisible];

    NSMutableArray* test = [[NSMutableArray alloc] initWithObjects:[NSString stringWithFormat:@"first!"], [NSString stringWithFormat:@"second!"], nil];
    [test insertObject:[NSString stringWithFormat:@"inserted"] atIndex:0];
    NSLog(@"%@", [test objectAtIndex:0]);
    NSLog(@"%@", [test objectAtIndex:1]);
    NSLog(@"%@", [test objectAtIndex:2]);
    NSLog(@"%@", [test count]); //bad access here
}

除了 count 方法之外的所有插入和访问都可以正常工作。我不明白为什么这不起作用,非常感谢一些帮助。谢谢!

【问题讨论】:

    标签: iphone objective-c ios nsmutablearray nslog


    【解决方案1】:

    %@ 格式说明符打印对象。 -count 的返回值只是一个无符号整数。您应该为该类型使用格式说明符 %u

    【讨论】:

    • 嗯,好的。非常感谢!格式说明符错误似乎是个奇怪的错误,哈哈。
    • @TNTisCOOL:不,一旦你知道它为什么会崩溃,这并不奇怪。 %@ 说明符想要一个对象的地址,并希望在其上调用[theObject description]。当您使用 [test count] 时,您实际上传递了一个类似 3 的数字,然后将其解释为地址,但 3 将是一个无效地址并尝试访问它(取消引用它)会导致崩溃。
    • 哦,有道理!谢谢!我希望我有声望给你投赞成票。
    【解决方案2】:

    问题在于[test count] 返回一个NSUInteger 而不是一个指针(指向NSObject)。试试这个:

    NSLog(@"%u", [test count]);
    

    请注意,使用%d 也可以,但首选%u

    【讨论】:

    • 由于返回值是NSUInteger,你应该使用%u而不是%d
    • 严格来说,%u 是 unsigned int,而 NSUInteger 更可能是 unsigned long。
    【解决方案3】:

    - (NSUInteger)count; 返回一个NSUInteger

    改用这个:

    NSLog(@"%u", [test count]); //bad access here
    

    【讨论】:

    • 它返回NSUInteger,而不是NSInteger
    • Aaand.. 澄清一下,错误访问的发生是因为"%@" 格式假定传递的参数是NSObject,并尝试调用方法-description,它应该返回一个@ 987654329@,但由于NSUInteger只是一个原语,它无法响应这样的方法。
    【解决方案4】:

    count 工作正常。然而,它确实返回了一个NSUInteger 原语,而不是一个指向NSObject 子类的指针。 %@ 字符串格式化程序需要一个指向对象的点并记录从该对象的-description 方法返回的NSString。当您将 NSUInteger NSLog 传递给它时,它假定它是一个对象指针,并尽职尽责地尝试将 -description 消息发送到内存地址 3,从而导致 EXEC_BAD_ACCESS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多