SlideShare ist ein Scribd-Unternehmen logo
1 von 38
“Let’s talk collections”
   или кое-что о коллекциях в iOS.
Наиболее часто
используемые коллекции
                                iOS 2.0
• массивы: NS(Mutable)Array
• словари: NS(Mutable)Dictionary
• множества (наборы): NS(Mutable)Set
                                iOS 5.0
• упорядоченные множества:
  NS(Mutable)OrderedSet
Кое-что редко
             используемое
•   СF(Mutable)ArrayRef        ➡NS(Mutable)Array
•   СF(Mutable)DictionaryRef   ➡NS(Mutable)Dictionary
•   СF(Mutable)SetRef          ➡NS(Mutable)Set
•   CF(Mutable)BagRef          NSCountedSet

•   CFTreeRef, CFBinaryHeapRef N/A


• NSPointerArray                              iOS 6.0

• NSMapTable
• NSHashTable
Специализированные
          коллекции

•   NS(Mutable)IndexSet

•   NS(Mutable)CharacterSet /
    CF(Mutable)CharacterSetRef

•   CF(Mutable)BitVector
Прочее
• Массивы C, ex:     int array[] = { 10, 20 };


• STL, Boost, etc., ex:
                     std::vector<int> arr;


• Сторонние библиотеки:
 ‣ ReactiveCocoa
 ‣ NSEnumeratorLinq (After MS LINQ)
 ‣ Underscore.m (After Underscore.js)
 ‣ SOCQ
 ‣ ... etc
Новое в работе с коллекциями
                   iOS 6
         Версия
Элемент                                              Пример
        LLVM/iOS
                       @[ @10, @YES, @"String" ]
                       @{ @"Key 1" : @"Value 1", @10 : @YES }


Литералы      4/all    + (id)arrayWithObjects:(const id[])objects
                                  count:(NSUInteger)count;

                       + (id)dictionaryWithObjects:(const id[])objects
                                     forKeys:(const id<NSCopying>[])keys
                                       count:(NSUInteger)count;
                       array[index / 2] = @(index << 1)
                       dict[key] = @NO

Индексаци              - (id)objectAtIndexedSubscript:(NSUInteger)idx;

    я
             4/iOS 5   - (id)objectForKeyedSubscript:(id)key;

                       - (void)setObject:(id)obj
                       atIndexedSubscript:(NSUInteger)idx;

                       - (void)setObject:(id)obj
                       forKeyedSubscript:(id<NSCopying>)key;
                       // Immutable dictionary
Shared Key             + (id)sharedKeySetForKeys:(NSArray *)keys;
   Sets
               x/6     // Mutable dictionary
                       + (id)dictionaryWithSharedKeySet:(id)set;
Что есть NSArray?
NSArray
     NSMutableArray
          __NSArrayM
          __NSCFArray
          __NSPlaceholderArray
     NSKeyValueMutableArray
          NSKeyValueSlowMutableArray
          NSKeyValueNotifyingMutableArray
          NSKeyValueIvarMutableArray
          NSKeyValueFastMutableArray
             NSKeyValueFastMutableArray1
             NSKeyValueFastMutableArray2
     NSKeyValueArray
     __NSArrayI
     __NSArrayReversed
Препарируя NSArray...
@interface __NSArrayM : NSMutableArray {
    unsigned int _size : 30;
    unsigned int _offset : 30;
    id *_list;
    unsigned long _mutations;
  ... ... ...
}

- (void)rollObjectsInRange:(NSRange *)range
                by:(int)number;

- (void)trimObjectsFromIndex:(unsigned)index;

@end
Интересные методы в
                       NS(Mutable)Array
+ (id)arrayWithFloats:(float *)items count:(NSUInteger)count;
+ (id)arrayWithInts:(int *)items count:(NSUInteger)count;

- (BOOL)_validateValue:(id __unsafe_unretained *)value
         forKeyPath:(NSString *)keyPath
      ofObjectAtIndex:(NSUInteger)index error:(id *)error;
- (id)_mutableArrayValueForKeyPath:(NSString *)keyPath
             ofObjectAtIndex:(NSUInteger)index;
- (id)_mutableSetValueForKeyPath:(NSString *)keyPath
            ofObjectAtIndex:(NSUInteger)index;

- (id)_valueForKeyPath:(NSString *)keyPath
      ofObjectAtIndex:(NSUInteger)index;
- (void)_setValue:(id)value
      forKeyPath:(NSString *)keyPath
  ofObjectAtIndex:(NSUInteger)index;

- (BOOL)_kb_firstTwoObjectsEqual;
- (NSArray *)allObjectsWithClass:(Class)class;
- (id)arrayByApplyingSelector:(SEL)selector;
- (id)arrayByExcludingObjectsInArray:(NSArray *)objects;
- (id)arrayByReversingOrder;
- (NSUInteger)indexOfSmallestObject;
- (id)repeatedNTimes:(int)N;

- (void)enqueueObject:(id)object;
- (id)dequeueObject;
- (id)pop;
- (void)push:(id)object;
- (void)removeFirstObject;
- (void)shuffle;
Showtime
Новые коллекции в iOS
   Тип
            6 Назначение
                      Коллекция, могущая содержать NULL;
                  позволяющая задавать собственный размер
NSPointerArray   непосредственно. Позволяет задавать правила
                   управления элементами: как памятью, так и
                               интерпретацией.
                 Позволяет иметь слабые ссылки как на ключи,
                  так и на значения. Позволяет копировать/не
 NSMapTable        копировать ключи/значения. Класть в нее
                        можно и простые указатели. Все
                                настраивается.
                  Позволяет иметь слабые ссылки на значения.
                 Позволяет копировать/не копировать значения.
 NSHashTable      Класть в нее можно и простые указатели. Все
                                настраивается.
Создание и использование
              NSPointerArray, ...
- (id)initWithOptions:(NSPointerFunctionsOptions)options;

+ (id)initWithPointerFunctions:(NSPointerFunctions *)functions;
+ (id)strongObjectsPointerArray;
+ (id)weakObjectsPointerArray;

- (void)addPointer:(void *)pointer;
- (void)removePointerAtIndex:(NSUInteger)index;
- (void)insertPointer:(void *)item
          atIndex:(NSUInteger)index;
- (void)replacePointerAtIndex:(NSUInteger)index
             withPointer:(void *)item;
- (void *)pointerAtIndex:(NSUInteger)index;
- (NSArray *)allObjects;
- (void)setCount:(NSUInteger)count;
- (void)compact;
... NSMapTable, ...
- (id)initWithKeyOptions:(NSPointerFunctionsOptions)keys
          valueOptions:(NSPointerFunctionsOptions)values
            capacity:(NSUInteger)capacity;

- (id)initWithKeyPointerFunctions:(NSPointerFunctions *)keyFunctions
          valuePointerFunctions:(NSPointerFunctions *)valueFunctions
                 capacity:(NSUInteger)capacity;

+ (id)mapTableWithKeyOptions:(NSPointerFunctionsOptions)keyOptions
         valueOptions:(NSPointerFunctionsOptions)valueOptions;

+ (id)strongToStrongObjectsMapTable;
+ (id)strongToWeakObjectsMapTable;
+ (id)weakToStrongObjectsMapTable;
+ (id)weakToWeakObjectsMapTable;

- (void)setObject:(id)value forKey:(id)key;
- (void)removeObjectForKey:(id)key;

- (NSDictionary *)dictionaryRepresentation;
... NSHashTable.
- (id)initWithOptions:(NSPointerFunctionsOptions)options
          capacity:(NSUInteger)capacity;

- (id)initWithPointerFunctions:(NSPointerFunctions *)functions
               capacity:(NSUInteger)capacity;

+ (id)hashTableWithOptions:(NSPointerFunctionsOptions)options;
+ (id)weakObjectsHashTable;

- (void)addObject:(id)object;
- (void)removeObject:(id)object;

- (NSArray *)allObjects;
- (id)anyObject;
- (BOOL)containsObject:(id)object;
- (id)member:(id)object;

- (NSSet *)setRepresentation;

- (BOOL)intersectsHashTable:(NSHashTable *)other;
- (BOOL)isSubsetOfHashTable:(NSHashTable *)other;

- (void)intersectHashTable:(NSHashTable *)other;
- (void)minusHashTable:(NSHashTable *)other;
- (void)unionHashTable:(NSHashTable *)other;
NSPointerFunctionsOptions
typedef NS_OPTIONS(NSUInteger, NSPointerFunctionsOptions) {
   NSPointerFunctionsStrongMemory = (0 << 0),
   NSPointerFunctionsOpaqueMemory = (2 << 0),
   NSPointerFunctionsMallocMemory = (3 << 0),
   NSPointerFunctionsMachVirtualMemory = (4 << 0),
   NSPointerFunctionsWeakMemory = (5UL << 0),

     NSPointerFunctionsObjectPersonality = (0 << 8),
     NSPointerFunctionsOpaquePersonality = (1 << 8),
     NSPointerFunctionsObjectPointerPersonality = (2 << 8),
     NSPointerFunctionsCStringPersonality = (3 << 8),
     NSPointerFunctionsStructPersonality = (4 << 8),
     NSPointerFunctionsIntegerPersonality = (5 << 8),

     NSPointerFunctionsCopyIn = (1 << 16),
};
NSMapTableOptions,
                       NSHashTableOptions
typedef NS_OPTIONS(NSUInteger, NSMapTableOptions) {
   NSMapTableStrongMemory = 0,
   NSMapTableCopyIn = NSPointerFunctionsCopyIn,
   NSMapTableWeakMemory = NSPointerFunctionsWeakMemory

     NSMapTableObjectPointerPersonality =
       NSPointerFunctionsObjectPointerPersonality,
};


typedef NS_OPTIONS(NSUInteger, NSHashTableOptions) {
   NSHashTableStrongMemory = 0,
   NSHashTableCopyIn = NSPointerFunctionsCopyIn,
   NSHashTableWeakMemory = NSPointerFunctionsWeakMemory

     NSHashTableObjectPointerPersonality =
       NSPointerFunctionsObjectPointerPersonality,
};
Showtime
Коллекции и KVC I
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;

- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath;

- (BOOL)validateValue:(inout id *)value
      forKeyPath:(NSString *)keyPath
         error:(out NSError * __autoreleasing *)error;
Коллекции и 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
                        опускается, дубликаты
                             опускаются).
Коллекции и 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
];
Доступные функции
         Функция
                 KVCМетоды NSArray
@avg                      - (id)_avgForKeyPath:(NSString *)keyPath;


@count                    - (id)_countForKeyPath:(NSString *)keyPath;


@distinctUnionOfArrays    - (id)_distinctUnionOfArraysForKeyPath:(NSString *)keyPath;


@distinctUnionOfObjects   - (id)_distinctUnionOfObjectsForKeyPath:(NSString *)keyPath;


@distinctUnionOfSets      - (id)_distinctUnionOfSetsForKeyPath:(NSString *)keyPath;


@max                      - (id)_maxForKeyPath:(NSString *)keyPath;


@min                      - (id)_minForKeyPath:(NSString *)keyPath;


@sum                      - (id)_sumForKeyPath:(NSString *)keyPath;


@unionOfArrays            - (id)_unionOfArraysForKeyPath:(NSString *)keyPath;


@unionOfObjects           - (id)_unionOfObjectsForKeyPath:(NSString *)keyPath;


@unionOfSets              - (id)_unionOfSetsKeyPath:(NSString *)keyPath;
Что есть предикаты?
NSPredicate
    NSCompoundPredicate
    NSComparisonPredicate
    NSBlockPredicate
    NSTruePredicate
    NSFalsePredicate
Создание предикатов
+ (P)predicateWithFormat:(S)predicateFormat, ...

+ (P)andPredicateWithSubpredicates:(A)subpredicates;

+ (P)orPredicateWithSubpredicates:(A)subpredicates;

+ (P)notPredicateWithSubpredicate:(P)predicate;


+ (P)predicateWithLeftExpression:(E)lhs rightExpression:(E)rhs
              modifier:(NSComparisonPredicateModifier)modifier
                 type:(NSPredicateOperatorType)type
               options:(NSComparisonPredicateOptions)options;

+ (P)predicateWithLeftExpression:(E)lhs rightExpression:(E)rhs customSelector:(SEL)selector;
       typedef NS_ENUM(NSUInteger,                                      typedef NS_OPTIONS(NSUInteger,
              NSPredicateOperatorType) {                                        NSComparisonPredicateOptions) {
          NSLessThanPredicateOperatorType,                                 NSCaseInsensitivePredicateOption,
          NSLessThanOrEqualToPredicateOperatorType,                        NSDiacriticInsensitivePredicateOption,
          NSGreaterThanPredicateOperatorType,                              NSNormalizedPredicateOption
          NSGreaterThanOrEqualToPredicateOperatorType,                  };
          NSEqualToPredicateOperatorType,
          NSNotEqualToPredicateOperatorType,                            typedef NS_ENUM(NSUInteger,
          NSMatchesPredicateOperatorType,                                       NSComparisonPredicateModifier) {
          NSLikePredicateOperatorType,                                     NSDirectPredicateModifier,
          NSBeginsWithPredicateOperatorType,                               NSAllPredicateModifier,
          NSEndsWithPredicateOperatorType,                                 NSAnyPredicateModifier
          NSInPredicateOperatorType,                                    };
          NSCustomSelectorPredicateOperatorType,
          NSContainsPredicateOperatorType,
          NSBetweenPredicateOperatorType
       };
Выражения+(E)expressionForBlock:(id(^)(id evaluatedObject,
NSExpression
                                        NSArray *expressions, NSMutableDictionary *context))block
                                              arguments:(NSArray *)arguments;
      NSAggregateExpression
                                       +(E)expressionForAggregate:(A)values;
      NSAnyKeyExpression               +(E)expressionForConstantValue:(id)value;
                                       +(E)expressionForEvaluatedObject;
      NSBlockExpression                +(E)expressionForVariable:(S)variable;
                                       +(E)expressionForKeyPath:(S)keyPath;
      NSConstantValueExpression
                                       +(E)expressionForFunction:(S)name
      NSFunctionExpression                      arguments:(A)arguments;

               NSKeyPathExpression     +(E)expressionForFunction:(S)name
                                              selectorName:(S)selectorName
      NSKeyPathSpecifierExpression              arguments:(A)arguments;

      NSSelfExpression                 +(E)expressionForIntersectSet:(E)left
                                                      with:(E)right;
                                       +(E)expressionForMinusSet:(E)left
      NSSetExpression                              with:(E)right;
                                       +(E)expressionForUnionSet:(E)left
      NSSubqueryExpression                         with:(E)right;

      NSSymbolicExpression             +(E)expressionForSubquery:(E)expression
                                         usingIteratorVariable:(S)variable
      NSTernaryExpression                        predicate:(P)predicate;

      NSVariableAssignmentExpression   +(E)expressionForSymbolicString:(S)string;
                                       +(E)expressionForTernaryWithPredicate:(P)predicate
      NSVariableExpression                trueExpression:(E)te falseExpression:(E)fe;
                                       +(E)expressionForVariableNameAssignment:(S)variableName
                                                           expression:(E)expression;
Функции предикатов
      Литерал                      Метод         Литерал                          Метод
                        add:to:                                       min:
                                             min(a), max(a),
                        from:subtract:                                max:
+, -, *, /, %           multiply:by:         sum(a)                   sum:
                        divide:by:
                        modulus:by:          average(a),              average:
                        raise:toPower:       stddev(a),               stddev:
                        leftshift:by:        median(a),               median:
**, <<, >>, sqrt(v)     rightshift:by:       mode(a)                  mode:
                        sqrt:
                        bitwiseAnd:with:     a[SIZE]                  count:
                        bitwiseOr:with:      a[index]                 objectFrom:withIndex:
&, |, ^, ~              bitwiseXor:with:
                        onesComplement:
                                             DISTINCT                 distinct:
CAST(value, “TYPE”)     castObject:toType:   noindex(v)               noindex:

                        ceiling:                                      exp:
ceiling(v), floor(v),                        exp(v), ln(v), log(v),
                        floor:                                        ln:
trunc(v)                trunc:               abs(v)                   log:
                                                                      abs:
                        random
random, randomn(v)      randomn:             lowercase(v),            lowercase:
now                     now                  uppercase(v)             uppercase:
Showtime
Коллекции и 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>:.
Коллекции и KVO II

• NSArray, NSOrderedSet, NSSet:
 ‣ Нельзя вызывать addObserver:forKeyPath:options:context:
• NSArray
 ‣ Можно вызывать
  addObserver:toObjectsAtIndexes:forKeyPath:options:context:

• NSDictionary
 ‣ Можно вызывать addObserver:forKeyPath:options:context:
Коллекции и KVO III
- (void)willChangeValueForKey:(NSString *)key;

- (void)willChange:(NSKeyValueChange)change
   valuesAtIndexes:(NSIndexSet *)indexes
        forKey:(NSString *)key;

- (void)willChangeValueForKey:(NSString *)key
         withSetMutation:(NSKeyValueSetMutationKind)mutationKind
            usingObjects:(NSSet *)objects;

- (void)didChangeValueForKey:(NSString *)key;

- (void)didChange:(NSKeyValueChange)change
  valuesAtIndexes:(NSIndexSet *)indexes
        forKey:(NSString *)key;

- (void)didChangeValueForKey:(NSString *)key
         withSetMutation:(NSKeyValueSetMutationKind)mutationKind
           usingObjects:(NSSet *)objects;
        typedef NS_OPTIONS(NSUInteger,               NSString *const NSKeyValueChangeKindKey;
               NSKeyValueChange) {                   NSString *const NSKeyValueChangeNewKey;
           NSKeyValueChangeSetting,                  NSString *const NSKeyValueChangeOldKey;
           NSKeyValueChangeInsertion,                NSString *const NSKeyValueChangeIndexesKey;
           NSKeyValueChangeRemoval,                  NSString *const NSKeyValueChangeNotificationIsPriorKey;
           NSKeyValueChangeReplacement
        };                                           typedef NS_OPTIONS(NSUInteger,
        typedef NS_OPTIONS(NSUInteger,                      NSKeyValueObservingOptions) {
               NSKeyValueSetMutationKind) {             NSKeyValueObservingOptionNew,
           NSKeyValueUnionSetMutation,                  NSKeyValueObservingOptionOld,
           NSKeyValueMinusSetMutation,                  NSKeyValueObservingOptionInitial,
           NSKeyValueIntersectSetMutation,              NSKeyValueObservingOptionPrior
           NSKeyValueSetSetMutation                  };
        };
Showtime
Core Foundation
• CFArrayRef / CFMutableArrayRef
• CFDictionaryRef / CFMutableDictionaryRef
• CFSetRef / CFMutableSetRef
• CFBagRef / CFMutableBagRef
• CFTreeRef
• CFBinaryHeapRef
Особенности 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
                                 );
Коллекция                                 Callback                            Predefined
              typedef struct {
                 CFIndex version;
                 CFArrayRetainCallBack retain;
  Array          CFArrayReleaseCallBack release;
                 CFArrayCopyDescriptionCallBack copyDescription;
                                                                     kCFTypeArrayCallBacks

                 CFArrayEqualCallBack equal;
              } CFArrayCallBacks;
              typedef struct {
                 // ...Like in prefixed prefixed CFDictionary
                 CFDictionaryHashCallBack hash;                      kCFTypeDictionaryKeyCallBacks
Dictionary    } CFDictionaryKeyCallBacks;

              typedef struct {
                                                                     kCFCopyStringDictionaryKeyCallBacks
                                                                     kCFTypeDictionaryValueCallBacks
                 // ...Like in array prefixed CFDictionary
              } CFDictionaryValueCallBacks;
              typedef struct {                                       kCFTypeSetCallBacks

  Set/Bag        // ...Like in dictionary but prefixed CFSet/CFBag
              } CFSet(Bag)CallBacks;
                                                                     kCFCopyStringSetCallBacks
                                                                     kCFTypeBagCallBacks
                                                                     kCFCopyStringBagCallBacks
              typedef struct {
                 CFIndex version;

   Tree
                 void *info;
                 CFTreeRetainCallBack retain;
                 CFTreeReleaseCallBack release;
                 CFTreeCopyDescriptionCallBack copyDescription;
              } CFTreeContext;
              typedef struct {
                 CFIndex version;
                 const void *(*retain)
                   (CFAllocatorRef allocator, const void *ptr);
                 void        (*release)
Binary Heap        (CFAllocatorRef allocator, const void *ptr);
                 CFStringRef (*copyDescription)(const void *ptr);
                                                                     kCFStringBinaryHeapCallBacks

                 CFComparisonResult (*compare)
                   (const void *ptr1,
                    const void *ptr2,
                    void *context);
              } CFBinaryHeapCallBacks;
Эффективность
                реализации
                  Вставка             Доступ           Поиск
                  worst/avg          worst/avg        worst/avg
                                                   O(N*lg N) /
  CFArray      O(N*lg N) / O(N)   O(lg N) / O(1)
                                                   < O(N*lg N)



CFDictionary   O(N*N) / O(1)      < O(N)           O(N) / O(1)




   CFSet       O(N*N) / O(1)      < O(N)           O(N) / O(1)




   CFBag       O(N*N) / O(1)      < O(N)           O(N) / O(1)
CFTreeRef
• Связь от одного parent к N children.
• Parent - владелец children. У children - слабые
  ссылки на Parent.
• Root тот, у кого нет ссылки на Parent.
• Контекст, заданный при создании Node,
  определяет правила управления памятью и
  получения описания над этим Node.
• Как правило, в функции работы с деревьями
  передается указатель на Parent Node, а
  операция осуществляется в отношении Child
  Node.
CFBinaryHeap
• Хранит значения в отсортированном виде.
• Любое новое значение встраивается в
  порядок, сохраняя сортировку.
• Позволяет скорейшим образом получить
  минимум набора значений, но не максимум
  (особенности реализации).
• Функция сравнения задается в поле compare в
  описателе при создании CFBinaryHeap.
• Правила управления памятью объектов в
  коллекции также задаются в описателе.
Showtime
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

Weitere ähnliche Inhalte

Was ist angesagt?

Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptDenis Latushkin
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»e-Legion
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageAlexander Granin
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 

Was ist angesagt? (20)

Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в Javascript
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell language
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 

Andere mochten auch

Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...
Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...
Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...Dwipen Boruah
 
SocNets Training Class
SocNets Training ClassSocNets Training Class
SocNets Training Classjoemansour
 
Integrated v non-integrated railway
Integrated v non-integrated railwayIntegrated v non-integrated railway
Integrated v non-integrated railwayAnthony Hsiao
 
Science and the Mind (Roger Penrose, Oxford University, May 1999)
Science and the Mind (Roger Penrose, Oxford University, May 1999)Science and the Mind (Roger Penrose, Oxford University, May 1999)
Science and the Mind (Roger Penrose, Oxford University, May 1999)Anthony Hsiao
 
Thoughtworks Ignite On Brains And Computing
Thoughtworks  Ignite    On  Brains And  ComputingThoughtworks  Ignite    On  Brains And  Computing
Thoughtworks Ignite On Brains And ComputingAnthony Hsiao
 
Egypt Maker Faire Africa 2011
Egypt Maker Faire Africa 2011Egypt Maker Faire Africa 2011
Egypt Maker Faire Africa 2011Mark Grimes
 
WordCamp Manchester 2016 - Making WordPress Menus Smarter
WordCamp Manchester 2016 - Making WordPress Menus SmarterWordCamp Manchester 2016 - Making WordPress Menus Smarter
WordCamp Manchester 2016 - Making WordPress Menus SmarterJonny Allbut
 
Lean, and reducing work in progress: Introduction to the cumulative flow diagram
Lean, and reducing work in progress: Introduction to the cumulative flow diagramLean, and reducing work in progress: Introduction to the cumulative flow diagram
Lean, and reducing work in progress: Introduction to the cumulative flow diagramAnthony Hsiao
 
EnTrip @ BCP5: Lessons from SeedCamp
EnTrip @ BCP5: Lessons from SeedCampEnTrip @ BCP5: Lessons from SeedCamp
EnTrip @ BCP5: Lessons from SeedCampAnthony Hsiao
 
Biomorph snake robot
Biomorph snake robotBiomorph snake robot
Biomorph snake robotAnthony Hsiao
 
2015-2016 Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio
2015-2016  Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio2015-2016  Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio
2015-2016 Big Time Podcast Stats and Demographics from Bigfoot Podcast StudioMark Grimes
 

Andere mochten auch (16)

Unidad 3 planner
Unidad 3   plannerUnidad 3   planner
Unidad 3 planner
 
Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...
Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...
Global Sustainable Energy Solutions (GSES) : Creating sustainable change thro...
 
SocNets Training Class
SocNets Training ClassSocNets Training Class
SocNets Training Class
 
JAY
JAYJAY
JAY
 
Integrated v non-integrated railway
Integrated v non-integrated railwayIntegrated v non-integrated railway
Integrated v non-integrated railway
 
Science and the Mind (Roger Penrose, Oxford University, May 1999)
Science and the Mind (Roger Penrose, Oxford University, May 1999)Science and the Mind (Roger Penrose, Oxford University, May 1999)
Science and the Mind (Roger Penrose, Oxford University, May 1999)
 
Thoughtworks Ignite On Brains And Computing
Thoughtworks  Ignite    On  Brains And  ComputingThoughtworks  Ignite    On  Brains And  Computing
Thoughtworks Ignite On Brains And Computing
 
Egypt Maker Faire Africa 2011
Egypt Maker Faire Africa 2011Egypt Maker Faire Africa 2011
Egypt Maker Faire Africa 2011
 
WordCamp Manchester 2016 - Making WordPress Menus Smarter
WordCamp Manchester 2016 - Making WordPress Menus SmarterWordCamp Manchester 2016 - Making WordPress Menus Smarter
WordCamp Manchester 2016 - Making WordPress Menus Smarter
 
Estrategia de marketing online para negocios locales
Estrategia de marketing online para negocios localesEstrategia de marketing online para negocios locales
Estrategia de marketing online para negocios locales
 
Lean, and reducing work in progress: Introduction to the cumulative flow diagram
Lean, and reducing work in progress: Introduction to the cumulative flow diagramLean, and reducing work in progress: Introduction to the cumulative flow diagram
Lean, and reducing work in progress: Introduction to the cumulative flow diagram
 
Time tracking
Time trackingTime tracking
Time tracking
 
EnTrip @ BCP5: Lessons from SeedCamp
EnTrip @ BCP5: Lessons from SeedCampEnTrip @ BCP5: Lessons from SeedCamp
EnTrip @ BCP5: Lessons from SeedCamp
 
Biomorph snake robot
Biomorph snake robotBiomorph snake robot
Biomorph snake robot
 
Unidad2 calc
Unidad2 calcUnidad2 calc
Unidad2 calc
 
2015-2016 Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio
2015-2016  Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio2015-2016  Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio
2015-2016 Big Time Podcast Stats and Demographics from Bigfoot Podcast Studio
 

Ähnlich wie Talks on collections

06 ns set
06   ns set06   ns set
06 ns setNoveo
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиVladimir Parfinenko
 
Memory managment in i os
Memory managment in i osMemory managment in i os
Memory managment in i osit-park
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
03 коллекции
03   коллекции03   коллекции
03 коллекцииNoveo
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Pavel Egorov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Technopark
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreDataDmitriy Kuragin
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...CocoaHeads
 
04 ns array
04   ns array04   ns array
04 ns arrayNoveo
 

Ähnlich wie Talks on collections (20)

06 ns set
06   ns set06   ns set
06 ns set
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, списки
 
Memory managment in i os
Memory managment in i osMemory managment in i os
Memory managment in i os
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
03 коллекции
03   коллекции03   коллекции
03 коллекции
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
Кратко о Mac OS X
Кратко о Mac OS XКратко о Mac OS X
Кратко о Mac OS X
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
 
04 ns array
04   ns array04   ns array
04 ns array
 

Talks on collections

  • 1. “Let’s talk collections” или кое-что о коллекциях в iOS.
  • 2. Наиболее часто используемые коллекции iOS 2.0 • массивы: NS(Mutable)Array • словари: NS(Mutable)Dictionary • множества (наборы): NS(Mutable)Set iOS 5.0 • упорядоченные множества: NS(Mutable)OrderedSet
  • 3. Кое-что редко используемое • СF(Mutable)ArrayRef ➡NS(Mutable)Array • СF(Mutable)DictionaryRef ➡NS(Mutable)Dictionary • СF(Mutable)SetRef ➡NS(Mutable)Set • CF(Mutable)BagRef NSCountedSet • CFTreeRef, CFBinaryHeapRef N/A • NSPointerArray iOS 6.0 • NSMapTable • NSHashTable
  • 4. Специализированные коллекции • NS(Mutable)IndexSet • NS(Mutable)CharacterSet / CF(Mutable)CharacterSetRef • CF(Mutable)BitVector
  • 5. Прочее • Массивы C, ex: int array[] = { 10, 20 }; • STL, Boost, etc., ex: std::vector<int> arr; • Сторонние библиотеки: ‣ ReactiveCocoa ‣ NSEnumeratorLinq (After MS LINQ) ‣ Underscore.m (After Underscore.js) ‣ SOCQ ‣ ... etc
  • 6. Новое в работе с коллекциями iOS 6 Версия Элемент Пример LLVM/iOS @[ @10, @YES, @"String" ] @{ @"Key 1" : @"Value 1", @10 : @YES } Литералы 4/all + (id)arrayWithObjects:(const id[])objects count:(NSUInteger)count; + (id)dictionaryWithObjects:(const id[])objects forKeys:(const id<NSCopying>[])keys count:(NSUInteger)count; array[index / 2] = @(index << 1) dict[key] = @NO Индексаци - (id)objectAtIndexedSubscript:(NSUInteger)idx; я 4/iOS 5 - (id)objectForKeyedSubscript:(id)key; - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx; - (void)setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key; // Immutable dictionary Shared Key + (id)sharedKeySetForKeys:(NSArray *)keys; Sets x/6 // Mutable dictionary + (id)dictionaryWithSharedKeySet:(id)set;
  • 7. Что есть NSArray? NSArray NSMutableArray __NSArrayM __NSCFArray __NSPlaceholderArray NSKeyValueMutableArray NSKeyValueSlowMutableArray NSKeyValueNotifyingMutableArray NSKeyValueIvarMutableArray NSKeyValueFastMutableArray NSKeyValueFastMutableArray1 NSKeyValueFastMutableArray2 NSKeyValueArray __NSArrayI __NSArrayReversed
  • 8. Препарируя NSArray... @interface __NSArrayM : NSMutableArray { unsigned int _size : 30; unsigned int _offset : 30; id *_list; unsigned long _mutations; ... ... ... } - (void)rollObjectsInRange:(NSRange *)range by:(int)number; - (void)trimObjectsFromIndex:(unsigned)index; @end
  • 9. Интересные методы в NS(Mutable)Array + (id)arrayWithFloats:(float *)items count:(NSUInteger)count; + (id)arrayWithInts:(int *)items count:(NSUInteger)count; - (BOOL)_validateValue:(id __unsafe_unretained *)value forKeyPath:(NSString *)keyPath ofObjectAtIndex:(NSUInteger)index error:(id *)error; - (id)_mutableArrayValueForKeyPath:(NSString *)keyPath ofObjectAtIndex:(NSUInteger)index; - (id)_mutableSetValueForKeyPath:(NSString *)keyPath ofObjectAtIndex:(NSUInteger)index; - (id)_valueForKeyPath:(NSString *)keyPath ofObjectAtIndex:(NSUInteger)index; - (void)_setValue:(id)value forKeyPath:(NSString *)keyPath ofObjectAtIndex:(NSUInteger)index; - (BOOL)_kb_firstTwoObjectsEqual; - (NSArray *)allObjectsWithClass:(Class)class; - (id)arrayByApplyingSelector:(SEL)selector; - (id)arrayByExcludingObjectsInArray:(NSArray *)objects; - (id)arrayByReversingOrder; - (NSUInteger)indexOfSmallestObject; - (id)repeatedNTimes:(int)N; - (void)enqueueObject:(id)object; - (id)dequeueObject; - (id)pop; - (void)push:(id)object; - (void)removeFirstObject; - (void)shuffle;
  • 11. Новые коллекции в iOS Тип 6 Назначение Коллекция, могущая содержать NULL; позволяющая задавать собственный размер NSPointerArray непосредственно. Позволяет задавать правила управления элементами: как памятью, так и интерпретацией. Позволяет иметь слабые ссылки как на ключи, так и на значения. Позволяет копировать/не NSMapTable копировать ключи/значения. Класть в нее можно и простые указатели. Все настраивается. Позволяет иметь слабые ссылки на значения. Позволяет копировать/не копировать значения. NSHashTable Класть в нее можно и простые указатели. Все настраивается.
  • 12. Создание и использование NSPointerArray, ... - (id)initWithOptions:(NSPointerFunctionsOptions)options; + (id)initWithPointerFunctions:(NSPointerFunctions *)functions; + (id)strongObjectsPointerArray; + (id)weakObjectsPointerArray; - (void)addPointer:(void *)pointer; - (void)removePointerAtIndex:(NSUInteger)index; - (void)insertPointer:(void *)item atIndex:(NSUInteger)index; - (void)replacePointerAtIndex:(NSUInteger)index withPointer:(void *)item; - (void *)pointerAtIndex:(NSUInteger)index; - (NSArray *)allObjects; - (void)setCount:(NSUInteger)count; - (void)compact;
  • 13. ... NSMapTable, ... - (id)initWithKeyOptions:(NSPointerFunctionsOptions)keys valueOptions:(NSPointerFunctionsOptions)values capacity:(NSUInteger)capacity; - (id)initWithKeyPointerFunctions:(NSPointerFunctions *)keyFunctions valuePointerFunctions:(NSPointerFunctions *)valueFunctions capacity:(NSUInteger)capacity; + (id)mapTableWithKeyOptions:(NSPointerFunctionsOptions)keyOptions valueOptions:(NSPointerFunctionsOptions)valueOptions; + (id)strongToStrongObjectsMapTable; + (id)strongToWeakObjectsMapTable; + (id)weakToStrongObjectsMapTable; + (id)weakToWeakObjectsMapTable; - (void)setObject:(id)value forKey:(id)key; - (void)removeObjectForKey:(id)key; - (NSDictionary *)dictionaryRepresentation;
  • 14. ... NSHashTable. - (id)initWithOptions:(NSPointerFunctionsOptions)options capacity:(NSUInteger)capacity; - (id)initWithPointerFunctions:(NSPointerFunctions *)functions capacity:(NSUInteger)capacity; + (id)hashTableWithOptions:(NSPointerFunctionsOptions)options; + (id)weakObjectsHashTable; - (void)addObject:(id)object; - (void)removeObject:(id)object; - (NSArray *)allObjects; - (id)anyObject; - (BOOL)containsObject:(id)object; - (id)member:(id)object; - (NSSet *)setRepresentation; - (BOOL)intersectsHashTable:(NSHashTable *)other; - (BOOL)isSubsetOfHashTable:(NSHashTable *)other; - (void)intersectHashTable:(NSHashTable *)other; - (void)minusHashTable:(NSHashTable *)other; - (void)unionHashTable:(NSHashTable *)other;
  • 15. NSPointerFunctionsOptions typedef NS_OPTIONS(NSUInteger, NSPointerFunctionsOptions) { NSPointerFunctionsStrongMemory = (0 << 0), NSPointerFunctionsOpaqueMemory = (2 << 0), NSPointerFunctionsMallocMemory = (3 << 0), NSPointerFunctionsMachVirtualMemory = (4 << 0), NSPointerFunctionsWeakMemory = (5UL << 0), NSPointerFunctionsObjectPersonality = (0 << 8), NSPointerFunctionsOpaquePersonality = (1 << 8), NSPointerFunctionsObjectPointerPersonality = (2 << 8), NSPointerFunctionsCStringPersonality = (3 << 8), NSPointerFunctionsStructPersonality = (4 << 8), NSPointerFunctionsIntegerPersonality = (5 << 8), NSPointerFunctionsCopyIn = (1 << 16), };
  • 16. NSMapTableOptions, NSHashTableOptions typedef NS_OPTIONS(NSUInteger, NSMapTableOptions) { NSMapTableStrongMemory = 0, NSMapTableCopyIn = NSPointerFunctionsCopyIn, NSMapTableWeakMemory = NSPointerFunctionsWeakMemory NSMapTableObjectPointerPersonality = NSPointerFunctionsObjectPointerPersonality, }; typedef NS_OPTIONS(NSUInteger, NSHashTableOptions) { NSHashTableStrongMemory = 0, NSHashTableCopyIn = NSPointerFunctionsCopyIn, NSHashTableWeakMemory = NSPointerFunctionsWeakMemory NSHashTableObjectPointerPersonality = NSPointerFunctionsObjectPointerPersonality, };
  • 18. Коллекции и KVC I - (id)valueForKey:(NSString *)key; - (void)setValue:(id)value forKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath; - (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath; - (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath; - (BOOL)validateValue:(inout id *)value forKeyPath:(NSString *)keyPath error:(out NSError * __autoreleasing *)error;
  • 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 ];
  • 21. Доступные функции Функция KVCМетоды NSArray @avg - (id)_avgForKeyPath:(NSString *)keyPath; @count - (id)_countForKeyPath:(NSString *)keyPath; @distinctUnionOfArrays - (id)_distinctUnionOfArraysForKeyPath:(NSString *)keyPath; @distinctUnionOfObjects - (id)_distinctUnionOfObjectsForKeyPath:(NSString *)keyPath; @distinctUnionOfSets - (id)_distinctUnionOfSetsForKeyPath:(NSString *)keyPath; @max - (id)_maxForKeyPath:(NSString *)keyPath; @min - (id)_minForKeyPath:(NSString *)keyPath; @sum - (id)_sumForKeyPath:(NSString *)keyPath; @unionOfArrays - (id)_unionOfArraysForKeyPath:(NSString *)keyPath; @unionOfObjects - (id)_unionOfObjectsForKeyPath:(NSString *)keyPath; @unionOfSets - (id)_unionOfSetsKeyPath:(NSString *)keyPath;
  • 22. Что есть предикаты? NSPredicate NSCompoundPredicate NSComparisonPredicate NSBlockPredicate NSTruePredicate NSFalsePredicate
  • 23. Создание предикатов + (P)predicateWithFormat:(S)predicateFormat, ... + (P)andPredicateWithSubpredicates:(A)subpredicates; + (P)orPredicateWithSubpredicates:(A)subpredicates; + (P)notPredicateWithSubpredicate:(P)predicate; + (P)predicateWithLeftExpression:(E)lhs rightExpression:(E)rhs modifier:(NSComparisonPredicateModifier)modifier type:(NSPredicateOperatorType)type options:(NSComparisonPredicateOptions)options; + (P)predicateWithLeftExpression:(E)lhs rightExpression:(E)rhs customSelector:(SEL)selector; typedef NS_ENUM(NSUInteger, typedef NS_OPTIONS(NSUInteger, NSPredicateOperatorType) { NSComparisonPredicateOptions) { NSLessThanPredicateOperatorType, NSCaseInsensitivePredicateOption, NSLessThanOrEqualToPredicateOperatorType, NSDiacriticInsensitivePredicateOption, NSGreaterThanPredicateOperatorType, NSNormalizedPredicateOption NSGreaterThanOrEqualToPredicateOperatorType, }; NSEqualToPredicateOperatorType, NSNotEqualToPredicateOperatorType, typedef NS_ENUM(NSUInteger, NSMatchesPredicateOperatorType, NSComparisonPredicateModifier) { NSLikePredicateOperatorType, NSDirectPredicateModifier, NSBeginsWithPredicateOperatorType, NSAllPredicateModifier, NSEndsWithPredicateOperatorType, NSAnyPredicateModifier NSInPredicateOperatorType, }; NSCustomSelectorPredicateOperatorType, NSContainsPredicateOperatorType, NSBetweenPredicateOperatorType };
  • 24. Выражения+(E)expressionForBlock:(id(^)(id evaluatedObject, NSExpression NSArray *expressions, NSMutableDictionary *context))block arguments:(NSArray *)arguments; NSAggregateExpression +(E)expressionForAggregate:(A)values; NSAnyKeyExpression +(E)expressionForConstantValue:(id)value; +(E)expressionForEvaluatedObject; NSBlockExpression +(E)expressionForVariable:(S)variable; +(E)expressionForKeyPath:(S)keyPath; NSConstantValueExpression +(E)expressionForFunction:(S)name NSFunctionExpression arguments:(A)arguments; NSKeyPathExpression +(E)expressionForFunction:(S)name selectorName:(S)selectorName NSKeyPathSpecifierExpression arguments:(A)arguments; NSSelfExpression +(E)expressionForIntersectSet:(E)left with:(E)right; +(E)expressionForMinusSet:(E)left NSSetExpression with:(E)right; +(E)expressionForUnionSet:(E)left NSSubqueryExpression with:(E)right; NSSymbolicExpression +(E)expressionForSubquery:(E)expression usingIteratorVariable:(S)variable NSTernaryExpression predicate:(P)predicate; NSVariableAssignmentExpression +(E)expressionForSymbolicString:(S)string; +(E)expressionForTernaryWithPredicate:(P)predicate NSVariableExpression trueExpression:(E)te falseExpression:(E)fe; +(E)expressionForVariableNameAssignment:(S)variableName expression:(E)expression;
  • 25. Функции предикатов Литерал Метод Литерал Метод add:to: min: min(a), max(a), from:subtract: max: +, -, *, /, % multiply:by: sum(a) sum: divide:by: modulus:by: average(a), average: raise:toPower: stddev(a), stddev: leftshift:by: median(a), median: **, <<, >>, sqrt(v) rightshift:by: mode(a) mode: sqrt: bitwiseAnd:with: a[SIZE] count: bitwiseOr:with: a[index] objectFrom:withIndex: &, |, ^, ~ bitwiseXor:with: onesComplement: DISTINCT distinct: CAST(value, “TYPE”) castObject:toType: noindex(v) noindex: ceiling: exp: ceiling(v), floor(v), exp(v), ln(v), log(v), floor: ln: trunc(v) trunc: abs(v) log: abs: random random, randomn(v) randomn: lowercase(v), lowercase: now now uppercase(v) uppercase:
  • 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:
  • 29. Коллекции и KVO III - (void)willChangeValueForKey:(NSString *)key; - (void)willChange:(NSKeyValueChange)change valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key; - (void)willChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects; - (void)didChangeValueForKey:(NSString *)key; - (void)didChange:(NSKeyValueChange)change valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key; - (void)didChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects; typedef NS_OPTIONS(NSUInteger, NSString *const NSKeyValueChangeKindKey; NSKeyValueChange) { NSString *const NSKeyValueChangeNewKey; NSKeyValueChangeSetting, NSString *const NSKeyValueChangeOldKey; NSKeyValueChangeInsertion, NSString *const NSKeyValueChangeIndexesKey; NSKeyValueChangeRemoval, NSString *const NSKeyValueChangeNotificationIsPriorKey; NSKeyValueChangeReplacement }; typedef NS_OPTIONS(NSUInteger, typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) { NSKeyValueSetMutationKind) { NSKeyValueObservingOptionNew, NSKeyValueUnionSetMutation, NSKeyValueObservingOptionOld, NSKeyValueMinusSetMutation, NSKeyValueObservingOptionInitial, NSKeyValueIntersectSetMutation, NSKeyValueObservingOptionPrior NSKeyValueSetSetMutation }; };
  • 31. Core Foundation • CFArrayRef / CFMutableArrayRef • CFDictionaryRef / CFMutableDictionaryRef • CFSetRef / CFMutableSetRef • CFBagRef / CFMutableBagRef • CFTreeRef • CFBinaryHeapRef
  • 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 );
  • 33. Коллекция Callback Predefined typedef struct { CFIndex version; CFArrayRetainCallBack retain; Array CFArrayReleaseCallBack release; CFArrayCopyDescriptionCallBack copyDescription; kCFTypeArrayCallBacks CFArrayEqualCallBack equal; } CFArrayCallBacks; typedef struct { // ...Like in prefixed prefixed CFDictionary CFDictionaryHashCallBack hash; kCFTypeDictionaryKeyCallBacks Dictionary } CFDictionaryKeyCallBacks; typedef struct { kCFCopyStringDictionaryKeyCallBacks kCFTypeDictionaryValueCallBacks // ...Like in array prefixed CFDictionary } CFDictionaryValueCallBacks; typedef struct { kCFTypeSetCallBacks Set/Bag // ...Like in dictionary but prefixed CFSet/CFBag } CFSet(Bag)CallBacks; kCFCopyStringSetCallBacks kCFTypeBagCallBacks kCFCopyStringBagCallBacks typedef struct { CFIndex version; Tree void *info; CFTreeRetainCallBack retain; CFTreeReleaseCallBack release; CFTreeCopyDescriptionCallBack copyDescription; } CFTreeContext; typedef struct { CFIndex version; const void *(*retain) (CFAllocatorRef allocator, const void *ptr); void (*release) Binary Heap (CFAllocatorRef allocator, const void *ptr); CFStringRef (*copyDescription)(const void *ptr); kCFStringBinaryHeapCallBacks CFComparisonResult (*compare) (const void *ptr1, const void *ptr2, void *context); } CFBinaryHeapCallBacks;
  • 34. Эффективность реализации Вставка Доступ Поиск worst/avg worst/avg worst/avg O(N*lg N) / CFArray O(N*lg N) / O(N) O(lg N) / O(1) < O(N*lg N) CFDictionary O(N*N) / O(1) < O(N) O(N) / O(1) CFSet O(N*N) / O(1) < O(N) O(N) / O(1) CFBag O(N*N) / O(1) < O(N) O(N) / O(1)
  • 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

  1. - Перечислить желтые - “Кроме того, &gt;&gt;&gt; NSOrderedSet, &gt;&gt;&gt; который появляется в iOS 5.
  2. - Core Foundation. - &gt;&gt;&gt; Новые в iOS 6 - &gt;&gt;&gt; NSPointerArray - &gt;&gt;&gt; NSMapTable - &gt;&gt;&gt; NSHashTable
  3. - NSArray - class-cluster. - &gt;&gt;&gt; И его иерархия примерно такова. И та не вся. - &gt;&gt;&gt; Ну а чаще всего мы встречаемся с...
  4. - Это лишь догадки, ибо исходников нет. - Но, что известно наверняка, что NSArray использует CFArrayRef. Это видно из исходников CoreFoundation CFArray
  5. Куча-куча методов с многообещающими именами - Почему Apple их не открыла - неизвестно. - Пространство имен загрязнено значительно. Хотя в дамп попадают методы категорий. - Странные методы indexOfSmallestObject. или repeatedNTimes:. firstObject, removeFirstObject.
  6. - NULL, fixed-size, управление через коллбеки.
  7. Интерфейс NSPointerArray - &gt;&gt;&gt; Управляется через NSPointerFunctionsOption, и NSPointerFunctions. О них чуть позже. - allObjects - compacting.
  8. NSMapTable. - (strong|weak)To(Strong|Weak)ObjectsMapTable shortcuts. - dictionaryRepresentation.
  9. NSHashTable - weakObjectsHashTable shortcut. - allObjects, setRepresentation.
  10. - первая половина - управление памятью - вторая - представление объекта, description, equality
  11. - работа hash и map гарантирована только при использовании этих ключей при создании.
  12. - Другие языки - Reflection.
  13. Этот набор можно дополнить своими; закономерность очевидна. Categories at your service.
  14. Приватность
  15. Предикаты раскладываются в другие предикаты и выражения. E - NSExpression P - NSPredicate A - NSArray S - NSString
  16. Приватность. E - NSExpression P - NSPredicate A - NSArray S - NSString
  17. Функции и операции, встречающиеся в formatString предикатов и выражений.