setValue:forKey:operation?

时间:2010-02-19 11:59:47

标签: objective-c

我很好奇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];
}

加里

2 个答案:

答案 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调用   属性如下搜索模式   使用:

     
      
  1. 搜索接收者的班级   名称匹配的访问器方法   模式-set<Key>:
  2.   

因此,当您的类具有必要的访问方法(通过属性声明)时,将调用此方法(setMyArray_i)(并保留您的数组)。