在返回对象后释放对象时出现内存泄漏警告问题。我读了几篇关于类似主题的帖子,但在这些帖子中,发布的问题是“他们”最终没有真正拥有他们发布的对象。
如果我在初始化同一个对象时使用autorelease,我没有遇到任何问题。我的问题是:如果Apple建议手动释放我们创建的所有对象,我怎么得到这个警告?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
//Display no cells until it loads
if([items count] < numberOfItemsToDisplay){
UITableViewCell *cell = [[[UITableViewCell alloc] init]autorelease];
return cell;
//[cell release];
}
我没有问题自动释放对象,但我讨厌不理解我认为我理解的东西:)
谢谢,L
答案 0 :(得分:2)
Apple没有说“手动释放你创建的所有对象” - 他们只是说“最终释放你创建的所有对象”。这可以通过手动释放或自动释放来完成。
autorelease基本上只是一个手动版本,发生在稍后的某个时刻(在[NSAutoreleasePool drain]
或[NSAutoreleasePool release]
被调用的时候)。
如果你想让你的一个方法返回一个由调用者拥有的对象,你必须使用自动释放,因为如果你在'return'之前调用release而且retain count则为零(这通常是你刚刚创建了对象)然后对象将被立即释放,然后无法使用。该方法的调用者发现自己有一个指向一些垃圾非对象的指针。
答案 1 :(得分:1)
返回return语句后,不再执行任何操作。因此返回后释放将不会执行。所以你会泄漏内存。并且您无法在返回之前释放,因为调用者将使用该对象。所以你真的无法在返回之前释放它。所以你有两种方法来处理这种情况。第一个选项是使返回的对象自动释放。另一种选择是以这样的方式创建函数名,使得调用者知道它拥有返回的对象并且必须释放它。
检查Returning Objects from Methods from Memory Management Programming Guide以了解此案例的详细说明。
答案 2 :(得分:0)
当你return cell
之后你没有拥有该对象,因此你不能release
它。执行return语句时,函数返回到调用它的位置。所以return
之后的语句没有被执行。因此,当release
cell
return
未执行后,cell
意味着{{1}}未被释放。因此它会引起记忆警告。
答案 3 :(得分:0)
在xcode中添加一个UitableView类,它会自动正确添加委托,以便重用tableviewcells。