Objective-C:实例变量作为参数,但在方法调用实例变量为空之后

时间:2011-04-21 15:53:18

标签: iphone objective-c

我做了一些iOS编程,我有UIViewController NSMutableArray

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

viewDidLoad中我想调用一个方法,该方法位于此UIViewController的实现中:

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

所以我用NSMutableArray调用该方法,UIViewControllermyMutableTestArray = [NSMutableArray arrayWithCapacity:100]; //... looping & generating some objects and adding them to the array: [myMutableTestArray adObject:myObject]; 的实例变量。在这个方法中,我这样做:

myMutableTestArray

现在,我调试它,方法mutableTestArray内部没问题。数组中有所有对象。但是,保留此方法的实例变量self.mutableTestArray为空。

那么,问题出在哪里?有人有想法吗? 注意:我知道我可以使用{{1}}访问实例变量然后一切都会正常,而是将其用作参数,但我想知道我的代码有什么问题。

提前谢谢你&最诚挚的问候。

3 个答案:

答案 0 :(得分:3)

参数在Objective-C中按值传递。因此,您将创建指向该对象的指针的副本并将其传递给该方法。当您myParam = ... new object ...;重置副本以指向新位置时,但对调用者中的原始副本没有影响。

(重申 - 你是复制指针,而不是复制对象。)

要解决此问题,请将测试方法声明为返回对象:

- (NSMutableArray *)aTestMethod;

然后,你可以简单地说:

self.mutableTestArray = [whateverObject aTestMethod];

(由于您实际上并未使用首先传入的值,因此根本不需要参数。)

答案 1 :(得分:2)

按你的命令

myMutableTestArray = [NSMutableArray arrayWithCapacity:100];

您正在创建mutableTestArray的分配。所以将mutableTestArray作为参数传递给aTestMethod:

[self aTestMethod:self.mutableTestArray];

没用,因为在aTestMethod中创建此数组时会立即覆盖其值。

尝试在将数组传递给方法之前创建数组(在那里填充数据)。

答案 2 :(得分:0)

请记住,参数是按值传输的,因此在aTestMethod中:您不是修改原始指针而是修改它的副本! 为此,您应该传递指针的地址,如

self aTestMethod:&(self.mutableArray)

那么方法的原型应该是

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

在代码中你应该使用* myArray,如

*myArray = [[NSMutableArray alloc] init];

你的,JB