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

Iphone Objective-C:实例变量作为参数,但方法调用后实例变量为空,iphone,objective-c,Iphone,Objective C,我做了一些iOS编程工作,我有一个UIViewController,带有NSMutableArray: @property (nonatomic, retain) NSMutableArray* mutableTestArray; ... @synthesize mutableTestArray; 在viewdiload中,我想调用此UIViewController实现中的一个方法: //- (void)aTestMethod:(NSMutableArray *)myMutableTestAr

我做了一些iOS编程工作,我有一个
UIViewController
,带有
NSMutableArray

@property (nonatomic, retain) NSMutableArray* mutableTestArray;
...
@synthesize mutableTestArray;
viewdiload
中,我想调用此
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
访问实例变量,然后一切都会好起来,而不是使用它作为参数,但我想知道我的代码出了什么问题


提前向您表示感谢和问候。

请记住,参数是通过值传输的,因此在ATESMethod中:您不是在修改原始指针,而是在修改它的副本! 要使其工作,您应该传递指针的地址,如中所示

self aTestMethod:&(self.mutableArray)
然后,该方法的原型应该是

-(void)aTestMethod:(NSMutableArray **)myArray
在它的代码中,应该使用*myArray,如中所示

*myArray = [[NSMutableArray alloc] init];

您的,JB

参数在Objective-C中按值传递。因此,您正在创建指向对象的指针的副本,并将其传递到方法中。当您执行
myParam=。。。新对象将副本重置为指向新位置,但对调用方中的原始副本没有影响

(重申——您是在复制指针,而不是复制对象。)

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

- (NSMutableArray *)aTestMethod;
然后,您可以简单地:

self.mutableTestArray = [whateverObject aTestMethod];
(由于您没有实际使用首先传入的值,因此根本不需要参数)。

通过您的命令

myMutableTestArray = [NSMutableArray arrayWithCapacity:100];
您正在创建新的可变测试阵列分配。因此,将可变TestArray作为参数传递给aTestMethod:

[self aTestMethod:self.mutableTestArray];
因为在AteSMethod内创建此数组时立即重写其值,所以该方法无效


在将数组传递给您的方法之前,请尝试创建数组(您将在其中填充数据)。

除了极少数情况外,Objective-C中不应使用“按引用传递”。这不是一个。根据定义,当方法返回
(void)
时,不需要使用按引用传递。绝对没有理由不使用按引用传递。我同意,在这种情况下,我可能不被认为是必要的,但在更一般的情况下,如果我在前面放了一个
&
,它可以用于获取行
self-aTestMethod:&(self.mutableArray)
错误“请求的属性表达式的地址”。框架中不使用传递引用;它不是系统的标准API模式的一部分(使您的API看起来/感觉像系统的API是一致性和可维护性的福音)。它容易出错,实例变量的按引用传递会破坏封装。passbyreference的两个用途是
NSError**
模式和多个返回值(它们实际上是相同的)。在多返回值的情况下,它几乎总是表明您的API设计应该被重新审视
self.mutableArray
是一个方法调用,不能在按引用传递上下文中使用。我不能这样做,因为在我的实际代码中,我必须传递几个可变和不可变数组,我只做了一个示例,否则概述可能会丢失。您需要添加一个更完整的示例。有许多可能的解决办法。就我个人而言,每当我看到“多个相关返回值”时,它都会请求一个简单的类,其实例可以封装所述的相关值。