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,因此这将是学习如何使用调试器的好机会.
这表示代码期望您的阵列存在的内存位置具有:
我的赌注是第一个.您需要仔细查看分配阵列的位置,并确保不允许其保留计数达到零.
请记住,如果您使用便捷方法(基本上以一个开头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)
那个人无数次地咬了我一次,包括在我提到不要做之后的演讲中间.