setValue: forKey: операция? - PullRequest
       7

setValue: forKey: операция?

2 голосов
/ 19 февраля 2010

Мне любопытно, что происходит с 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];
}

1009 * Гэри *

Ответы [ 2 ]

5 голосов
/ 19 февраля 2010

Ответ - да, два фрагмента кода по сути делают одно и то же. setValue:forKey не сохраняет массив, но находит синтезированный метод setMyArray_x, который, в свою очередь, сохраняет массив. iVarName лучше называть propertyName или keyName. Однако, если вы не объявили и не синтезировали свойства, а вместо этого имели только четыре ивара, setValue:forKey все равно сможет установить для них значение animalArray , но оно не будет сохранено .

3 голосов
/ 19 февраля 2010

Прежде всего [self setMyArray_1: animalArray]; не просто устанавливает указатели, но также сохраняет входной массив - так как он вызывает автоматически сгенерированный метод установки и его поведение определяется в соответствующих атрибутах свойства:

@property(nonatomic, retain) NSArray *myArray_1; // retain !

Способ поиска метода доступа описан в Подробности реализации поиска средства доступа в «Руководстве по кодированию KVC»:

При реализации по умолчанию setValue: forKey: вызывается для свойство следующий шаблон поиска используется:

  1. Поиск класса получателя метод доступа, имя которого совпадает шаблон -set<Key>:.

Так как у вашего класса есть необходимый метод доступа (объявленный через свойство), этот метод (setMyArray_i) будет вызван (и сохранит ваш массив).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...