Цикл через NSMutableArray пользовательских объектов в большей части памяти эффективный путь

Я описал это в изрядном количестве детали в статья , но вот сводка, предполагая, что Вы довольно довольны делегаты сами:

  • событие является просто "добавить" методом и "удалить" методом, таким же образом что свойство является действительно просто "получить" методом и методом "набора". (На самом деле CLI позволяет метод "повышения/огня" также, но C# никогда не генерирует это.) Metadata описывает событие со ссылками на методы.
  • , Когда Вы объявляете подобное полю событие (как Ваш ElementAddedEvent) компилятор генерирует методы и частное поле (того же типа как делегат). В классе, когда Вы обращаетесь к ElementAddedEvent, Вы обращаетесь к полю. Вне класса Вы обращаетесь к полю.
  • , Когда любой подписывается на событие (с + = оператор), который называет добавить метод. Когда они отказываются от подписки (с - = оператор), который называет удалять.
  • Для подобных полю событий, существует некоторая синхронизация, но иначе добавление/удаление просто звонит Делегату. Объединение / Удаляют для изменения значения автоматически сгенерированного поля. Обе из этих операций присваивают отступающему полю - помнят, что делегаты неизменны. Другими словами, автоматически сгенерированный код очень похож на это:

    // 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 {} просто анонимный метод, который не заботится о его параметрах и ничего не делает.

, Если существует что-нибудь, которое это все еще неясно, спросите, и я попытаюсь помочь!

14
задан James P. Wright 3 November 2009 в 21:12
поделиться

2 ответа

for (WhateverYourClassNameIs *whateverNameYouWant in yourArrayName) {
    [whateverNameYouWant performSelector];
    more code here;
}

Это называется быстрым перечислением и было новой функцией в Objective C 2.0, которая доступна на iPhone.

35
ответ дан 1 December 2019 в 06:12
поделиться

Я бы, вероятно, просто использовал предикат, который был бы примерно таким:

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];
  }
}
17
ответ дан 1 December 2019 в 06:12
поделиться