我很好奇setValue发生了什么:forKey:在下面的代码片段中:它只是将指针设置为指向每个数组,类似于......
[self setMyArray_1: animalArray];
[self setMyArray_2: animalArray];
[self setMyArray_3: animalArray];
另外:setValue:forKey是否保留数组?我猜它(如上所述)
代码段:
// INTERFACE
@property(nonatomic, retain) NSArray *myArray_1;
@property(nonatomic, retain) NSArray *myArray_2;
@property(nonatomic, retain) NSArray *myArray_3;
// IMPLEMENTATION
@synthesize myArray_1;
@synthesize myArray_2;
@synthesize myArray_3;
for(counter=1; counter<=3; counter++) {
NSArray *animalArray = [[NSArray alloc] initWithObjects:@"cat", @"rat", nil];
NSString *propertyName = [[NSString alloc] initWithFormat:@"myArray_%d", counter];
[self setValue:animalArray forKey:propertyName];
[animalArray release];
[propertyName release];
}
加里
答案 0 :(得分:5)
答案是肯定的,两个代码片段基本上做同样的事情。 setValue:forKey
不保留数组,但它找到合成的setMyArray_x方法,后者又保留数组。 iVarName最好称为propertyName或keyName。但是,如果您尚未声明并合成属性,而只是有四个ivars,setValue:forKey
仍然可以将它们设置为指向animalArray
,但它不会被保留
答案 1 :(得分:3)
首先[self setMyArray_1: animalArray];
不只设置指针,但也保留输入数组 - 因为它调用自动生成的setter方法,其行为在相应的属性属性中定义:
@property(nonatomic, retain) NSArray *myArray_1; // retain !
如何在“KVC编码指南”的Accessor Search Implementation Details中描述搜索访问者方法:
默认执行时 setValue:forKey:为a调用 属性如下搜索模式 使用:
- 搜索接收者的班级 名称匹配的访问器方法 模式
醇>-set<Key>:
。
因此,当您的类具有必要的访问方法(通过属性声明)时,将调用此方法(setMyArray_i)(并保留您的数组)。