Обновление заголовочного файла
Этот метод создает новый изменяемый словарь, а затем циклически проходит по всем ключам исходного словаря, делая изменяемые копии каждого встреченного массива. Так как этот метод будет вести себя так же, как если бы он был частью NSDictionary, любая ссылка на объект self является ссылкой на словарь, для которого вызывается этот метод. Метод сначала пытается выполнить глубокое изменяемое копирование, и если объект не отвечает на сообщение mutableDeepCopy, он пытается сделать изменяемые копии. Если объект не отвечает на сообщение mutableCopy, метод возвращается к созданию обычной копии, чтобы гарантировать, что копируются все объекты, содержащиеся в словаре. При таком образе действий, если у нас имеется словарь, содержащий словари (или другие объекты, которые поддерживают глубокие изменяемые копии), к содержимому также применяется глубокое изменяемое копирование.
В язык Objective-C 2.0 вошла новая функциональная возможность под названием быстрого перечисления. Быстрое перечисление (fast enumeration) представляет собой замену класса NSEnumerator на уровне языка. Оно позволяет быстро итерировать коллекции, такие как класс NSArray, без хлопот по созданию дополнительных объектов или переменных циклов.
Все классы коллекций Cocoa, в том числе NSDictionary, NSArray и NSSet., поддерживают быстрое перечисление, и вы должны использовать этот синтаксис всякий раз, когда необходимо выполнить итерацию коллекции. Это будет гарантировать применение наиболее эффективного цикла.
Возможно, вы заметили, что здесь создается впечатление наличия утечки памяти. Мы выделяем и инициализируем переменную returnDict, но никогда не освобождаем ее. Это нормально. Поскольку наш метод имеет в своем имени слово сору, он следует тем же правилам работы с памятью, что и метод copyWithZone:, который, как предполагается, должен вернуть объект со счетчиком ссылок, равным 1. С другой стороны, вы могли заметить, что мы освобождаем каждую создаваемую нами копию, и удивиться излишнему освобождению этих новых объектов. На самом деле мы освобождаем каждый скопированный объект только после добавления его a returnDict, который по контракту является единственным объектом, который наш метод не должен освобождать.
Если мы включим заголовочный файл NSDictionary-MutableDeepCopy.h в один из других наших классов, то получим возможность вызывать mutableDeepCopy для любого объекта NSDictionary, который захотим. Воспользуемся этим.
Обновление заголовочного файла контроллер. Далее, мы должны добавить некоторые выходы в заголовочный файл класса контроллера. Мы добавим выход для табличного представления. До сих пор нам не требовался указатель на табличное представление вне методов источника данных.
- Дата: 3-12-2014, 00:49