我正在尝试调试一个应用程序,这个应用程序会抛出奇怪的(对我未经过眼睛处理的)错误。当我尝试简单地记录数组的计数时......
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,因此这是学习如何使用调试器的好机会。
答案 0 :(得分:5)
这表示您的代码期望您的阵列存在的内存位置具有:
我的赌注是第一个。您需要仔细查看分配阵列的位置,并确保不允许其保留计数达到零。
请记住,如果您使用便捷方法(基本上以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包含一个坏指针(未初始化)或指向已经释放的东西的指针(并重新用于其他东西)。