int size = (&arr)[1] - arr;
Проверьте эту ссылку для объяснения
Я нашел это в документации ( Соответствие KVC - Зависимые значения ):
Важно: обратите внимание, что вы не можете настроить зависимости от отношений ко многим. Например, предположим, что у вас есть Заказ объект с отношением ко многим (orderItems) в коллекцию Объекты OrderItem и OrderItem объекты имеют атрибут цены. Ты может потребоваться, чтобы объект Order имел totalPrice, то есть зависит от цен на все Объекты OrderItem в отношении. Вы не можете этого сделать, реализовав keyPathsForValuesAffectingValueForKey: и возврат orderItems.price в качестве keypath для totalPrice.Вы должны соблюдать ценовой атрибут каждого из объекты OrderItem в orderItems и ответить на изменения их значений путем обновления Итого Цените себя.
Таким образом, вы не можете полагаться на зависимости или уведомления KVO, когда в пути к ключу существует отношение ко многим . Это относится к моему массиву тегов, поэтому я добавил код для исправления этой неработающей ссылки.
Когда я добавляю проект в массив "projects":
[newProject addObserver:self forKeyPath:@"tags" options:NSKeyValueObservingOptionNew context:nil];
И важная часть:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([object isKindOfClass:[CProject class]] && [keyPath isEqualToString:@"tags"])
{
[self willChangeValueForKey:@"projects"];
[self didChangeValueForKey:@"projects"];
}
}
И для очистки, когда я удаляю проект:
[project removeObserver:self forKeyPath:@"tags"];
Не уверен, что это лучшее решение, но оно постоянно обновляю мой список.
Я весьма удивлен, что ваш первый фрагмент кода вообще компилируется. Он также может работать не совсем так, как вы ожидаете, потому что
self.property = foo;
- это синтаксический сахар для
[self setProperty: foo];
В любом случае, ваша проблема возможно в том, что вы не соблюдаете теги
. Я не уверен, что предикат автоматически учитывает ключи в строке запроса.