1

我有一个使用 ARC 的 NSArray 属性的类,没有什么花哨的......

#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];
}

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

4

1 回答 1

1

setArrayByPassingArray:在第一个示例中的方法将新创建的方法分配NSArray给它的参数,该参数由 value传递,并在退出方法时立即丢弃。这里发生的是myArray在调用setArrayByPassingArray:. 该副本不再附加到 的myArray成员MyClass

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

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

-(void)setArrayByPassingArray:(NSMutableArray *)arrayToSet {
    [arrrayToSet setArray:[[NSArray alloc] initWithObjects: @"test", @"test2", nil]];
}
于 2012-04-15T00:27:30.327 回答