调试意外错误消息 - 可能的内存管理问题?

时间:2010-05-12 00:15:03

标签: objective-c cocoa memory-management

我正在尝试调试一个应用程序,这个应用程序会抛出奇怪的(对我未经过眼睛处理的)错误。当我尝试简单地记录数组的计数时......

NSLog(@"Array has %i items", [[self startingPlayers] count]);

......我有时会收到错误:

-[NSCFString count]: unrecognized selector sent to instance 0x1002af600

或其他时间

-[NSConcreteNotification count]: unrecognized selector sent to instance 0x1002af600

我没有向任何NSString或NSNotification发送'count',这行代码正常工作。

理论......

虽然错误有所不同,但崩溃发生在可预测的时间,在我运行其他代码之后,我认为我可能会遇到内存管理问题。是否有可能对象引用仍指向要销毁的东西?对不起,如果我的条款关闭了,但也许它期望数组在它所谓的'count'的地址,但是找到另一个不应该存在的前一个对象(例如NSString)?这会导致问题吗?

如果是这样,调试和找出该地址的最有效方法是什么?到目前为止,我的大多数调试都涉及插入NSLog,因此这是学习如何使用调试器的好机会。

2 个答案:

答案 0 :(得分:5)

这表示您的代码期望您的阵列存在的内存位置具有:

  1. 已取消分配并且已在同一位置分配了另一个变量
  2. 遭到一些不良代码的打击
  3. 我的赌注是第一个。您需要仔细查看分配阵列的位置,并确保不允许其保留计数达到零。

    请记住,如果您使用便捷方法(基本上以array开头)分配数组,而不是保留它或使用点表示法(例如self.myArray = [NSArray arrayWith...])和属性分配它标记为retain,只要您分配它的方法返回,它就会被释放。

    TL; DR是检查您分配阵列的位置,并确保您使用的是这样的:

    self.startingPlayers = [NSArray arrayWithObjects:@"first", @"second", nil];
    

    而不是这样:

    startingPlayers = [NSArray arrayWithObjects:@"first", @"second", nil];
    

    那个人无数次地咬我,包括在我提到不要做之后的演讲中间。

答案 1 :(得分:1)

[self startingPlayers]返回什么?首先尝试打印:

NSLog(“startingPlayers is%@”,self.startingPlayers);

也许startingPlayers包含一个坏指针(未初始化)或指向已经释放的东西的指针(并重新用于其他东西)。