2011-04-21 58 views
2

我做了一些iOS的編程的東西,我有一個UIViewControllerNSMutableArray的Objective-C:實例變量作爲參數,但方法調用實例變量後是空的

@property (nonatomic, retain) NSMutableArray* mutableTestArray; 
... 
@synthesize mutableTestArray; 

viewDidLoad我想打電話給一個方法是這樣UIViewController裏面執行:

//- (void)aTestMethod:(NSMutableArray *)myMutableTestArray; 
[self aTestMethod:self.mutableTestArray]; 

所以我叫了NSMutableArray這是UIViewController的實例變量的方法。在此方法中,我這樣做:

myMutableTestArray = [NSMutableArray arrayWithCapacity:100]; 
//... looping & generating some objects and adding them to the array: 
[myMutableTestArray adObject:myObject]; 

現在,我調試和方法內myMutableTestArray是罰款。數組中有所有對象。但是留下這個方法的實例變量mutableTestArray是空的。

那麼,問題在哪裏?任何人的想法? 注意:我知道我可以用self.mutableTestArray訪問實例變量,然後一切都會好起來,而不是將它用作參數,但我想知道我的代碼有什麼問題。

謝謝你提前&最好的問候。

回答

3

參數由VALU傳遞e在Objective-C中。因此,您正在創建一個指向該對象的指針副本並將其傳遞給該方法。當您執行myParam = ... new object ...;時,會將副本重置爲指向新位置,但不會影響調用方中的原始副本。

(要重申 - 你是複製指針,不複製對象

來解決,聲明你的測試方法返回一個對象:

- (NSMutableArray *)aTestMethod; 

然後,你可以簡單地:

self.mutableTestArray = [whateverObject aTestMethod]; 

(因爲你實際上沒有使用傳入的值他第一個地方,根本不需要參數)。

+0

我不能這樣做,因爲在我真實的代碼中,我必須傳遞幾個可變和不可變數組,我只做了一個例子,否則概覽可能會丟失。 – Tim 2011-04-21 16:29:21

+0

您需要添加更完整的示例。有許多可能的解決方案。就個人而言,無論何時我看到「多個相關的返回值」,它都需要一個簡單的類,其實例可以封裝所述相關值。 – bbum 2011-04-21 17:16:24

0

請記住,參數是通過值傳輸的,所以在一個TestMethod中:您不是修改原始指針,而是修改它的副本! 對於這個工作,你應該通過指針的地址作爲

self aTestMethod:&(self.mutableArray) 

那麼該方法的原型應該是

-(void)aTestMethod:(NSMutableArray **)myArray 

,並在它的代碼,你應該使用* myArray的作爲在

*myArray = [[NSMutableArray alloc] init]; 

此致,JB

+0

保存最常見的極少數情況下,絕對不能在Objective-C中使用傳遞引用。這不是一個。根據定義,當方法返回'(void)'時,使用傳遞引用是不必要的。 – bbum 2011-04-21 16:05:58

+0

絕對沒有理由不使用傳遞引用。我同意在這種情況下我可能不被認爲是必要的,但是在更一般的上下文中,它可以被使用 – 2011-04-21 16:14:40

+0

我得到'self aTestMethod:&(self.mutableArray)'請求的屬性表達式的錯誤地址「如果我把'&&放在它前面。 – Tim 2011-04-21 16:28:16

2

通過您的命令

myMutableTestArray = [NSMutableArray arrayWithCapacity:100]; 

要創建新分配的mutableTestArray。所以通過mutableTestArray作爲參數傳遞給aTestMethod:因爲你馬上重寫它的值時,創建這個數組您aTestMethod內

[self aTestMethod:self.mutableTestArray]; 

是沒用的。

嘗試在將數組傳遞給方法之前創建數組(其中將使用數據填充它)。