2010-10-15 41 views
0

如何和何時發佈在UITableViewDelegate中返回的IndexPath對象?如何在Objective-c中釋放傳遞給協議或委託方法的對象?

讓我們想象代碼:

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

    [delegate didSelectItemAtIndex:number]; 
} 
在我的委託

我有方法:

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

當第一種方法創建的對象的NSNumber應該被釋放?如果我使用autorelease或在方法中釋放,它將不會在我的代理中訪問。如果我離開它,可能會出現內存泄漏

回答

4

只需發佈它之後您調用委託方法(或使用autorelease)。

委託調用只是一個普通的方法調用,所以它同步發生。 (如果委託人確實想要掛在對象上並稍後使用它,則取決於它的代表retain它在Cocoa中的內存管理的基本規則是每個方法負責保留(並隨後釋放)對象它需要保持在附近)。

另外,請注意,在你的例子中你有另一個內存泄漏:你是alloc ing編號,然後給它分配另一個值(泄漏初始值)。

假設methodreturningnumber將返回一個自動釋放的對象,你不需要做任何額外的內存管理;只是:

NSNumber *number=[self methodreturningnumber]; 
[delegate didSelectItemAtIndex:number]; 
+0

我改變了這個,但是如何保留這個對象呢?我在下面描述了問題。 – plusz 2010-10-17 16:21:10

0

我只是測試它的變化後,它的工作原理,但在ISSE下一步 如果我嘗試使用這個變量之後,它會丟失出現。

我改變對象的名稱,使分析更容易:

//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(OBJ 3)我有方法是從所謂的它的子視圖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 - > OBJ2 - > OBJ1 - > OBJ3 - > OBJ4 - > OBJ3

OBJ1呼叫OBJ2(通過自身作爲代表) OBJ2產生的NSNumber X和呼叫的方法OBJ1用的NSNumber X

OBJ1呼叫作爲presentModalViewController OBJ3的,並設置X爲可被正常顯示的OBJ3

OBJ3屬性之一,並且可以訪問NSNumberX

OBJ3 VievController類子視圖OBJ4(顯示在同一視圖屏幕)

當我點擊OBJ4時,它調用方法OBJ3沒有參數 和OBJ3有地址的NSNumber,但它超出了範圍。

..........

+0

我想知道如果我創建對象的初始方法可能對此有任何影響: NSNumber * numSliceId = [[NSNumber alloc] init]; numSliceId = [NSNumber numberWithFloat:12345]; return [numSliceId autorelease]; – plusz 2010-10-15 17:15:32