Я описал это в изрядном количестве детали в статья , но вот сводка, предполагая, что Вы довольно довольны делегаты сами:
Для подобных полю событий, существует некоторая синхронизация, но иначе добавление/удаление просто звонит Делегату. Объединение / Удаляют для изменения значения автоматически сгенерированного поля. Обе из этих операций присваивают отступающему полю - помнят, что делегаты неизменны. Другими словами, автоматически сгенерированный код очень похож на это:
// Backing field
// The underscores just make it simpler to see what's going on here.
// In the rest of your source code for this class, if you refer to
// ElementAddedEvent, you're really referring to this field.
private EventHandler __ElementAddedEvent;
// Actual event
public EventHandler ElementAddedEvent
{
add
{
lock(this)
{
// Equivalent to __ElementAddedEvent += value;
__ElementAddedEvent = Delegate.Combine(__ElementAddedEvent, value);
}
}
remove
{
lock(this)
{
// Equivalent to __ElementAddedEvent -= value;
__ElementAddedEvent = Delegate.Remove(__ElementAddedEvent, value);
}
}
}
начальное значение сгенерированного поля в Вашем случае null
- и это будет всегда становиться null
снова, если все подписчики будут удалены, поскольку это - поведение Делегата. Удалить.
, Если Вы хотите, чтобы обработчик "нет" подписался на Ваше событие, чтобы избежать проверки ничтожности, можно сделать:
public EventHandler ElementAddedEvent = delegate {};
Эти delegate {}
просто анонимный метод, который не заботится о его параметрах и ничего не делает.
, Если существует что-нибудь, которое это все еще неясно, спросите, и я попытаюсь помочь!
for (WhateverYourClassNameIs *whateverNameYouWant in yourArrayName) {
[whateverNameYouWant performSelector];
more code here;
}
Это называется быстрым перечислением и было новой функцией в Objective C 2.0, которая доступна на iPhone.
Я бы, вероятно, просто использовал предикат, который был бы примерно таким:
NSArray * filtered = [myArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"aProperty = %@", @"someValue"]];
NSLog(@"number of items where aProperty = someValue: %d", [filtered count]);
Изменить: этот код функционально эквивалентен:
NSMutableArray * filtered = [NSMutableArray array];
for (MyCustomObject * object in myArray) {
if ([[object aProperty] isEqual:@"someValue"]) {
[filtered addObject:object];
}
}