makeObjectsPerformSelector:

Я только что запустил ваш код, он не имеет ничего общего с добавлением или удалением ключа. Вы получаете ошибку, когда заполняете свой объект списка

List<Entity> list = db.books.ToList();
foreach(var l in list)
{
   list.Add(l);
}

у вас уже есть список книг, так какова цель цикла foreach?

Вы получаете ошибку, потому что добавляете новые объекты при перечислении по списку, это недопустимо, потому что это будет инфинитив

17
задан Binarian 30 May 2014 в 17:29
поделиться

4 ответа

makeObjectsPerformSelector: движение должно выполнить тот селектор против каждого объекта в массиве. Если те объекты будут изменены селектором, то они будут изменены. Это ничего не возвращает. Теперь, существует выгода, которая это по умолчанию большинство копий в Какао является мелкими копиями, что означает, что Вы получаете новый массив, но основные объекты, на которые это указывает, являются теми же объектами. Необходимо будет использовать initWithArray:copyItems, чтобы заставить его скопировать корневые объекты уровня также. Если Вы хотите новый массив, содержащий измененные объекты, а также старый массив делают что-то вроде этого:

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];
29
ответ дан 30 November 2019 в 10:31
поделиться

В дополнение к другим ответам, если Вы делаете , хотят, создают новый массив с результатом вызова метода, можно сделать это:

NSArray *derivedArray = [originalArray valueForKey:@"foo"];

Это будет только работа, если Ваши объекты могут обработать 'сообщение' "нечто" -valueForKey:@ и очевидно, только подходят для методов, которые не берут аргументов и возвращают ненулевое значение.

7
ответ дан 30 November 2019 в 10:31
поделиться

, Если я использую его на массиве, это изменит существующий массив или возвратит новый?

Прежде всего, считайте подпись:

- (void)makeObjectsPerformSelector:(SEL)aSelector

void, без звезд после него, “does средств не возвращают anything”.

1113-секундный, обратите внимание, что это - метод NSArray, который является неизменным классом. Поэтому makeObjectsPerformSelector: не видоизменяет приемную антенную решетку, потому что это невозможно.

существует NSMutableArray, и так как это - подкласс NSArray, он наследовался makeObjectsPerformSelector:. Однако, если бы NSMutableArray изменил поведение того метода, то его документация имела бы его собственный список для метода (см. много определений init в документации различных классов). Нет такого списка, таким образом, Вы можете безопасно (и правильно) выводят что -[NSMutableArray makeObjectsPerformSelector:] работы точно тот же путь как -[NSArray makeObjectsPerformSelector:].

объекты могут изменить themselvesВ в ответ на Ваше сообщение, но сам массив будет содержать те же объекты после makeObjectsPerformSelector: как перед ним.

15
ответ дан 30 November 2019 в 10:31
поделиться

Я надеюсь, что интерпретирую это правильно...

, Если Вы делаете [myArray makeObjectsPerformSelector:someSelector], Вы эффективно просто выполняете итерации через myArray и отправляете селекторное сообщение в каждый объект. Массив неизменен, потому что makeObjectsPerformSelector не позволяют изменить его содержание.

Так в конце, у Вас есть тот же массив с теми же объектами.

2
ответ дан 30 November 2019 в 10:31
поделиться