如何在Objective-c中释放传递给协议或委托方法的对象?

时间:2010-10-15 12:27:50

标签: objective-c memory-management

如何以及何时发布在UITableViewDelegate中返回的IndexPath对象?

让我们想象代码:

//my method in my object
{
    NSNumber *number=[[NSNumber alloc] init];
    number=[[self methodreturningnumber] retain];

    [delegate didSelectItemAtIndex:number];
}

在我的代表中我有方法:

-(void)didSelectItemAtIndex:(NSNumber *)number
{
}

何时应该释放在第一种方法中创建的对象NSNumber?如果我使用自动释放或在方法中释放它,我的代表将无法访问它。如果我保持原样,可能会有内存泄漏

2 个答案:

答案 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的地址,但它超出了范围。

..........