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

Ben*_*ard 0 cocoa memory-management objective-c

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

NSLog(@"Array has %i items", [[self startingPlayers] count]);
Run Code Online (Sandbox Code Playgroud)

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

-[NSCFString count]: unrecognized selector sent to instance 0x1002af600
Run Code Online (Sandbox Code Playgroud)

或其他时间

-[NSConcreteNotification count]: unrecognized selector sent to instance 0x1002af600
Run Code Online (Sandbox Code Playgroud)

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

理论......

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

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

Fra*_*itt 5

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

  1. 已取消分配,另一个变量已在同一位置分配
  2. 遭到一些糟糕的代码的破坏

我的赌注是第一个.您需要仔细查看分配阵列的位置,并确保不允许其保留计数达到零.

请记住,如果您使用便捷方法(基本上以一个开头array)分配数组,而不是保留它或使用点表示法(例如self.myArray = [NSArray arrayWith...])和标记的属性分配它retain,则可能会在方法中尽快释放它你分配它返回.

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

self.startingPlayers = [NSArray arrayWithObjects:@"first", @"second", nil];
Run Code Online (Sandbox Code Playgroud)

而不是这样的:

startingPlayers = [NSArray arrayWithObjects:@"first", @"second", nil];
Run Code Online (Sandbox Code Playgroud)

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