2012-09-06 93 views
0

我想從一個方法返回多個值和我已經決定要使用的陣列這樣做內存管理

-(NSArray *) foo { 
    // some operations here 
    return @[node, [NSNumber numberWithInt:i], [NSNumber numberWithBool:flag]]; 
} 

一個例子是

-(NSArray *) foo { 
    return @[@"hi", [NSNumber numberWithInt:3], [NSNumber numberWithBool:YES]]; 
} 

這是一個優選的方式,因爲有一個像這樣創建的NSArray對象,需要保留,但可以在以後沒有新的所有者時發佈,這是否真的需要在自動釋放池中?

-(NSArray *) foo { 
    @autorelease { 
     // some operations here 
     return @[node, [NSNumber numberWithInt:i], [NSNumber numberWithBool:flag]]; 
    } 
} 
+2

你可以寫成'@ [node,@(i),@(flag)]' – hypercrypt

+0

我已經編輯了你的問題,專注於內存管理方面。關於如何返回多個值的問題已經在SO上至少提出了兩次。這有答案:[從方法返回多個值](http://stackoverflow.com/questions/1692005/returning-multiple-values-from-a-method-in-objective-c?rq=1) –

回答

1

這autoreleasepool是不必要的。 runloop已經有一個autorelease池,並且你在返回時創建的數組被標記爲autorelease,所以這個數組將被釋放。

您不會從一個objective-c方法返回多個值,就像您不會從c返回多個值一樣。您可以將方法的引用傳遞給方法,並在方法中分配值,或者返回包含您希望返回的數據的集合對象,或者創建一個包含您希望從方法返回的響應的自定義類。

+0

aha ,它需要返回的數據非常奇特,創建一個只包含這個數據集合的類似乎很奇怪 –

1

您有幾個選項。

  1. 創建並返回字典。這具有優勢(超過返回一個NSArray),您不依賴於數組上的項目的順序或數量。您可以有條件地返回一些物品。
  2. 實現一個代表您需要返回的信息的新類。該類應該具有所有必需的屬性,因此您可以創建一個實例,設置屬性並將其返回。
  3. 回到依reference

    - (void)someMethod:(int)argument returnValue1:(int *)ret1 returnValue2:(int *)ret2; 
    

    然後,您可以這樣調用它:

    int r1; 
    int r2; 
    [object someMethod:arg returnValue1:&r1 returnValue2:&r2]; 
    // r1 and r2 now contain the values that were set in the method implementation. 
    
1

沒有。它的確切目的是自動釋放,以便不必明確地釋放它。如果您將自動釋放池中的return XYZ..語句包裝起來,它將被釋放(這不是你想要的,因爲它隨後被釋放,並且返回一個指向調用者函數的無效指針),或者因爲函數返回,泳池永遠不會發生,而且你基本上最終會泄漏泳池本身。你要麼不添加任何這樣的東西,要麼在調用者函數中使用autorelease池。

+0

你可以泄漏池本身,你確定嗎? –

+0

@JeremyL僅當它作爲反向懸掛指針安全特性內置到編譯器中時纔有效。 – 2012-09-17 18:29:16

1

使用ARC進行編譯時不需要執行任何操作 - 它會爲您處理此內存管理。實際上,將對象放入autorelease塊中的方法是錯誤,因爲您需要該對象超過方法的末尾並返回給調用方。

根據MRR,你確保返回值是autoreleased,這就是ARC爲你做的。

但是,在任何方案下放置的自動釋放池都處於較高級別 - 在被調用的函數之外。