我是新手,但我读了很多关于内存管理的内容,并且我自己也试图找到答案。 这听起来很基本,但我显然没有得到它。 我在.h:
中有一个NSMutableArray作为属性@property (nonatomic, retain) NSMutableArray *documentListArray;
我合成它并在(void)dealloc中释放它。 为了填充数组,我有一个方法 - (void)updateRecordList并在那里:
self.documentListArray=[DocumentDatabase getDocumentListSortedByDate];
编辑:下一行:
[[self recordListTableView] reloadData];
其中DocumentDatabase是一个具有类方法getDocumentListSortedByDate和getDocumentList的不同类。 以下是getDocumentListSortedByDate中发生的事情:
NSMutableArray *returnArray = [DocumentDatabase getDocumentList];
//sorting...
NSLog("array count:%i",[returnArray count]); //returns correct numbers first and second time
return returnArray;
和getDocumentList
NSMutableArray *returnArray = [NSMutableArray arrayWithCapacity:files.count];
//add file data to array...
return returnArray;
第一次调用updateRecordList时这是有效的,但是在添加文件并第二次调用updateRecordList后,它会崩溃(使用NSZombies): * - [NSCFNumber dealloc]:发送到解除分配的实例0x7504c90的消息。 通过大量的日志记录,我将问题缩小到updateRecordList中的上一行,如果我将其更改为:
self.documentListArray=[[DocumentDatabase getDocumentListSortedByDate] retain];
我的结论是getDocumentList中的数组在到达之前已经自动释放。所以我的问题是:
1.为什么我必须在那里保留它?这不应该通过声明属性(保留)来实现吗?
或者,换句话说,为什么阵列过早自动释放(假设这是正在发生的事情)?
2.当我为self.documentListArray分配一个新数组时,是否会自动释放旧数组?如果我在获取新的documentList之前尝试自己发布它,它也会崩溃。
提前感谢您的回复。
编辑: 也许我是个白痴:我没有提到documentListArray是UITableView的数据源(参见顶部的添加行)。我怀疑我在填充表视图时出错了,数组被保留了......?但它确实在分配属性时崩溃,而不是在reloadData上崩溃。 如果我正确使用UITableViewDataSource协议,我会回去学习。感谢大家,你的回答让我有希望走上正轨。解决后会更新。
EDIT2: 它现在无需保留,我想我理解为什么:我进行了大量调试,发现对象中包含的对象添加到数组中的nil。特别是,在编码的内部,我在分配值时没有使用“self”。解码时,那些值为nil。因为我改变了它,它似乎工作。 我怀疑没有分配新数组导致崩溃,但TableView会读取新数组 - 甚至在我调用reloadData之前。这将导致戴维斯同步访问的问题。谢谢大家的帮助。
答案 0 :(得分:1)
您显示的代码似乎是正确的;只要在自动释放池耗尽之前将值赋值给具有retain
语义的属性,就不必(或正确)调用自己保留。所有调用(getDocumentListSortedByDate,getDocumentList)是否同步发生,或者您是否在后台执行此操作?仔细检查您是否使用“自我”进行分配。 (“self.documentListArray =”)而不是直接分配给实例var(“documentListArray =”);如果省略“self。”,则会绕过setter。
不,在分配之前不要释放旧值;这是安装者的工作。