11. Новые коллекции в iOS
Тип
6 Назначение
Коллекция, могущая содержать NULL;
позволяющая задавать собственный размер
NSPointerArray непосредственно. Позволяет задавать правила
управления элементами: как памятью, так и
интерпретацией.
Позволяет иметь слабые ссылки как на ключи,
так и на значения. Позволяет копировать/не
NSMapTable копировать ключи/значения. Класть в нее
можно и простые указатели. Все
настраивается.
Позволяет иметь слабые ссылки на значения.
Позволяет копировать/не копировать значения.
NSHashTable Класть в нее можно и простые указатели. Все
настраивается.
19. Коллекции и KVC II
- (id)valueForKey: - (void)setValue:(id)value
(NSString *)key; forKey:(NSString *)key;
setObject:forKey:, если value !
NSDictionary (I/M) То же, что и objectForKey: = nil; иначе,
removeObjectForKey:
Массив результатов
NSArray (I/M) valueForKey: над каждым
элементом (NSNull если nil).
Множество результатов
valueForKey: над каждым
NSSet (I/M) элементом (nil опускается, setValue:forKey: над каждым
дубликаты опускаются). элементом.
Упорядоченное множество
результатов valueForKey: над
NSOrderedSet (I/M) каждым элементом (nil
опускается, дубликаты
опускаются).
20. Коллекции и KVC III
Person *oldestPerson = [people valueForKeyPath:@"@max.age"];
NSArray *uniqueNamesOfSiblings =
[person valueForKeyPath:@"mother.children.@distinctUnionOfArrays.name"];
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"name BEGINSWITH 'J' AND age >= 18"];
NSArray *allAdultJs = [people filteredArrayUsingPredicate:predicate];
NSPredicate *predicate =
[NSPredicate predicateWithFormat:
@"FUNCTION(SELF, "capitalizedString") BEGINSWITH[cd] 'H'"
];
NSArray *startingFromCapitalH = [
@[ @"hello", @"world" ] filteredArrayUsingPredicate:predicate
];
27. Коллекции и KVO I
NSArray/NSMutableArray NSSet/NSMutableSet
KVC-Compliance KVC-Compliance
• Импелементировать -<key>.
• ИЛИ завести ivar <key> или _<key>.
• Импелементировать -<key>.
• ИЛИ имплементировать -countOf<Key> И
• ИЛИ завести ivar <key> или _<key>.
один или оба -objectIn<Key>AtIndex: и/или
-<key>AtIndexes:.
• ИЛИ имплементировать -countOf<Key>,
-enumeratorOf<Key>, и -memberOf<Key>
• Для улучшения производительности
имплементировать -get<Key>:range:.
• Импелементировать один или оба
-insertObject:in<Key>AtIndex: и/или
-insert<Key>:atIndexes:.
• Импелементировать один или оба
-add<Key>Object: и/или -add<Key>:.
• Импелементировать один или оба
-removeObjectFrom<Key>AtIndex: и/или • Импелементировать один или оба
-remove<Key>Object: и/или -remove<Key>:.
-remove<Key>AtIndexes:.
• Для улучшения производительности • Для улучшения производительности
имплементировать
имплементировать
-intersect<Key>: и/или -set<Key>:.
-replaceObjectIn<Key>AtIndex:withObject: и/или
-replace<Key>AtIndexes:with<Key>:.
28. Коллекции и KVO II
• NSArray, NSOrderedSet, NSSet:
‣ Нельзя вызывать addObserver:forKeyPath:options:context:
• NSArray
‣ Можно вызывать
addObserver:toObjectsAtIndexes:forKeyPath:options:context:
• NSDictionary
‣ Можно вызывать addObserver:forKeyPath:options:context:
32. Особенности CF-
коллекций
Особенность Способ определения
CFArrayCreateMutable(
kCFAllocatorDefault,
Могут быть как fixed-size, так <NUMBER_OF_ITEMS>,
и variable-size. &kCFTypeArrayCallBacks
);
Если <NUMBER_OF_ITEMS> == 0, то variable-size
CFArrayCallBacks,
Поведение при CFDictionaryKeyCallBacks,
добавлении/удалении/поиск CFDictionaryValueCallBacks,
CFSetCallBacks,
е элементов определяется CFBagCallBacks,
при создании. CFTreeContext,
CFBinaryHeapCallBacks/CFBinaryHeapCompareContext
CFArrayRef a = (__bridge_retained CFArrayRef)[NSArray new];
CF(Mutable)ArrayRef, CFArrayRef a = (__bridge CFArrayRef)[NSArray array];
CF(Mutable)DictionaryRef, NSArray *a = (__bridge_transfer NSArray *) CFArrayCreate(
0,
CF(Mutable)SetRef - toll-free (const void **) &(CFStringRef *){
bridged. CFSTR("1"),
NULL
Можно класть NULL или ints },
2,
с размерностью указателя. NULL
);
35. CFTreeRef
• Связь от одного parent к N children.
• Parent - владелец children. У children - слабые
ссылки на Parent.
• Root тот, у кого нет ссылки на Parent.
• Контекст, заданный при создании Node,
определяет правила управления памятью и
получения описания над этим Node.
• Как правило, в функции работы с деревьями
передается указатель на Parent Node, а
операция осуществляется в отношении Child
Node.
36. CFBinaryHeap
• Хранит значения в отсортированном виде.
• Любое новое значение встраивается в
порядок, сохраняя сортировку.
• Позволяет скорейшим образом получить
минимум набора значений, но не максимум
(особенности реализации).
• Функция сравнения задается в поле compare в
описателе при создании CFBinaryHeap.
• Правила управления памятью объектов в
коллекции также задаются в описателе.
38. That’s all, folks!
• http://opensource.apple.com/source/CF/CF-744.12/
• http://funwithobjc.tumblr.com/post/2922267976/using-custom
• http://kickingbear.com/blog/archives/9
• https://github.com/nst/iOS-Runtime-Headers
• Apple Documentation
• Презентация на Slideshare:
http://www.slideshare.net/comfly/talks-on-collections
• Код на Github:
https://github.com/comfly/CollectionSamples
Hinweis der Redaktion
- Перечислить желтые - “Кроме того, >>> NSOrderedSet, >>> который появляется в iOS 5.
- Core Foundation. - >>> Новые в iOS 6 - >>> NSPointerArray - >>> NSMapTable - >>> NSHashTable
- NSArray - class-cluster. - >>> И его иерархия примерно такова. И та не вся. - >>> Ну а чаще всего мы встречаемся с...
- Это лишь догадки, ибо исходников нет. - Но, что известно наверняка, что NSArray использует CFArrayRef. Это видно из исходников CoreFoundation CFArray
Куча-куча методов с многообещающими именами - Почему Apple их не открыла - неизвестно. - Пространство имен загрязнено значительно. Хотя в дамп попадают методы категорий. - Странные методы indexOfSmallestObject. или repeatedNTimes:. firstObject, removeFirstObject.
- NULL, fixed-size, управление через коллбеки.
Интерфейс NSPointerArray - >>> Управляется через NSPointerFunctionsOption, и NSPointerFunctions. О них чуть позже. - allObjects - compacting.