2010-11-19 80 views
0

我有一个NSMutableArray我试图在异步调用后重新加载。第一次加载像这样:iOS - 重置NSMutable Array导致崩溃

self.sessionProcList = [NSMutableArray arrayWithArray:[result records]]; 

在用户做了一些交互之后,将会到达重载NSMutableArray的同一行。这导致崩溃

头文件有:

@interface... 
NSMutableArray *sessionProcList; 
... } 

@property (nonatomic, retain) NSMutableArray *sessionProcList; 
+1

什么是崩溃? – 2010-11-19 04:50:25

+0

你确定在这种情况下应该使用非原子吗? – 2010-11-19 05:00:04

+0

老实说,我不确定。我一直在寻找一个很好的例子,重用NSMutableArray并重新设置操作之间的值w /没有运气。这是一个非常简单的屏幕。只需重新加载数组值。 什么是最简单的方法来声明?而不是我正在使用的方法。我的方法对于同步单例很好,但似乎不适用于单个接口类。 – 2010-11-19 05:17:56

回答

0

如果我猜的话,我会说,该数组中元素被从其他地方引用。重置数组会导致使用引用的项目崩溃。

我会检查您的应用程序的其他变量,属性或UI元素使用这些变量,尚未释放之前重置它。

+0

谢谢jocull!我想我可能并没有完全找到释放它的地方。我对这些数组中的项目有几种类型的调用。 ZKSObject * tmpSessionProc = [self.sessionProcList objectAtIndex:indexPath.row]; 如果我释放,我得到一个“发送到释放实例的消息”崩溃。我错过了什么?再次感谢! – 2010-11-19 05:07:07

+0

我不认为你需要释放* tmpSessionProc因为你没有的Alloc变量存在。它是从self.sessionProcList引用的,所以如果你在* t​​mpSessionProc中释放它,你也可以在self.sessionProcList中释放它。您可以尝试使用XCode中的开发人员控制台(如NSLog(“Retain count:%i”,[tmpSessionProc retainCount]))进行一些调试。 – jocull 2010-11-19 05:50:44

1

说你做:

NSMutableArray *a = [NSMutableArray arrayWithObject: [[NSObject alloc] init]]; 
NSObject *o = [a objectAtIndex: 0]; 
[a removeAllObjects]; 
[o description]; // *BOOM* 

上面会[一般 - 有时没有,但只有巧合]崩溃,因为o已释放由被调用的方法description的时间。

如果您有一个对数组中的对象的引用,但没有保留所述引用,那么当您清空数组时,可能会从您之下释放所述对象。

(和nonatomic与原子是无关的。)

+0

[[NSObject alloc] init]是否导致保留? – joshpaul 2010-11-22 15:29:23

0

由于arrayWithArray是一个方便的方法它被用一个自动释放标志初始化。

你还没有提到崩溃/错误消息是什么,但我猜你的NSMutableArray在你的第二次迭代开始之前就已经发布了。

尝试并保留数组不过多久,你需要它:

self.sessionProcList = [NSMutableArray arrayWithArray:[result records]]; 
[sessionProcList retain]; 

,然后释放它,当你用它做:

[sessionProcList release]; 

我希望它能帮助。 Rog

+0

如果您使用属性,这是一个保留属性,您不需要再保留它。这不是导致崩溃的问题。 – JeremyP 2010-11-19 15:19:07