2011-04-21 59 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]; 

是没用的。

尝试在将数组传递给方法之前创建数组(其中将使用数据填充它)。