我做了一些iOS编程,我有UIViewController
NSMutableArray
:
@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
为空。
那么,问题出在哪里?有人有想法吗? 注意:我知道我可以使用{{1}}访问实例变量然后一切都会正常,而是将其用作参数,但我想知道我的代码有什么问题。
提前谢谢你&最诚挚的问候。
答案 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