如何以及何时发布在UITableViewDelegate中返回的IndexPath对象?
让我们想象代码:
//my method in my object
{
NSNumber *number=[[NSNumber alloc] init];
number=[[self methodreturningnumber] retain];
[delegate didSelectItemAtIndex:number];
}
在我的代表中我有方法:
-(void)didSelectItemAtIndex:(NSNumber *)number
{
}
何时应该释放在第一种方法中创建的对象NSNumber?如果我使用自动释放或在方法中释放它,我的代表将无法访问它。如果我保持原样,可能会有内存泄漏
答案 0 :(得分:4)
在调用委托方法(或使用自动释放)之后,只需将其发布。
委托调用只是一个普通的方法调用,所以它同步发生。 (如果委托确实想要挂起对象并在以后使用它,则由retain
委托给它.Cocoa内存管理的基本规则是每个方法都负责保留(以及之后)释放)它需要保留的物体。)
另外,请注意您的示例中有另一个内存泄漏:您是alloc
数字,然后为其分配另一个值(泄漏初始值)。
假设methodreturningnumber
正在返回一个自动释放的对象,则不需要进行任何额外的内存管理;只是:
NSNumber *number=[self methodreturningnumber];
[delegate didSelectItemAtIndex:number];
答案 1 :(得分:0)
我刚刚在更改后对其进行了测试,但它确实有效,但是下一步就出现了 如果我稍后尝试使用此变量,则会丢失。
我更改了对象名称以便于分析:
//my method in my object OBJ2
{
[delegate didSelectItemAtIndex:[self methodreturningnumber]];
}
在我的委托(OBJ1)中我有方法:
-(void)didSelectItemAtIndex:(NSNumber *) NSNUMBER
{
SliceDetailsViewController * OBJ2 = [[SliceDetailsViewController alloc] initWithNibName:nil bundle:nil];
OBJ2. NSNUMBER = NSNUMBER; // <---------- THIS IS LOST IF I DON'T ADD RETAIN [NSNUMBER retain]
OBJ2.pieChart = graphView;
OBJ2.myColors=myColors;
[self presentModalViewController:sliceDetailsController animated:YES];
[sliceDetailsController release];
}
在我的modalWindow(OBJ3)中我有从它的子视图OBJ4中调用的方法
- (void)colorPicker:(ColorPicker *)myColorPicker didSelectItemAtIndex:(NSNumber *)indexPath
{
[OBJ2 setColor:NSNUMBER value:indexPath]; // <------ SLICEID IS NOT AVAILABLE HERE IF NOT RETAINED IN PREVIOUS OBJECT
}
OBJ4调用上面的方法:
[delegate colorPicker:self didSelectItemAtIndex:atrribute];
........... 被调用的方法来自对象: OBJ1 - &gt; OBJ2 - &gt; OBJ1 - &gt; OBJ3 - &gt; OBJ4 - &gt; OBJ3
OBJ1调用OBJ2(将self作为委托传递) OBJ2生成NSNumber X并使用NSNumber X调用OBJ1的方法
OBJ1调用presentModalViewController OBJ3并将X设置为OBJ3的属性之一
OBJ3正确显示,可以访问NSNumberX
OBJ3 VievController类子视图OBJ4(视图显示在同一屏幕上)
当我点击OBJ4时,它调用OBJ3的方法而不带参数 和OBJ3具有NSNumber的地址,但它超出了范围。
..........