NSArray仅在传递类时才更改

时间:2012-04-15 00:13:02

标签: objective-c ios

我有一个带有NSArray属性的类,使用ARC而没有任何花哨......

#import <Foundation/Foundation.h>
@interface MyClass : NSObject
property(nonatomic, strong) (NSArray *) myArray;
@end

#import "MyClass.h"
@implementation MyClass
@synthesize myArray = _myArray;
@end

如果尝试使用另一个类内部的方法来尝试设置该数组,则只有传递数组才会设置该数组;但是,它确实设置了如果该类通过,我不知道为什么会这样....

尝试这两种方式的代码低于......

MyClass *myClass = [[MyClass alloc] init];
[self setArrayByPassingArray:myClass.myArray];
NSLog (@"%@", myClass.myArray)
//result is null

[self setArrayByPassingClass:myClass];
NSLog (@"%@", myClass.myArray)
//result is test, test2...

-(void)setArrayByPassingArray:(NSArray *)arrayToSet {
arrrayToSet = [[NSArray alloc] initWithObjects: @"test", @"test2", nil];
}

-(void)setArrayByPassingClass:(MyClass *)classWithArrayToSet {
classWithArrayToSet.myArray = = [[NSArray alloc] initWithObjects: @"test", @"test2", nil];
}

我尝试了其他只使用字符串的方法而且字符串没有改变,所以如果传递包含它们的类,我不确定它们为什么会被更改...

1 个答案:

答案 0 :(得分:1)

第一个示例中的setArrayByPassingArray:方法将新创建的NSArray分配给参数,该参数通过值传递,并且及时从该方法退出时丢弃。这里发生的是在调用myArray之前创建了对setArrayByPassingArray:的引用的副本(不是数组的副本,只是对该数组的引用的副本)。该副本不再附加到myArray的{​​{1}}成员。

你的第二个例子没有传递一个类 - 它正在传递类的实例,然后它正确地使用点符号在你的实例中分配MyClass属性。这就是为什么第二个例子有效,第一个例子没有。

如果您在整个程序中使用myArray而不是NSMutableArray,则可以重写第一个示例以使其正常工作:

NSArray