Как хранить слабый ссылочный объект в массиве, словарь в objc? Как мы знаем, когда вы добавляете объект в массив (NSMutableArray) или словарь (NSMutableDictionary), он создает сильную ссылку на объект. Можно ли добавить объект в массив со слабой ссылкой на него? Ответ 1 1.NSValue + (NSValue *)valueWithNonretainedObject:(id)anObject Этот метод полезен, если вы хотите добавить объект в коллекцию, но не хотите, чтобы коллекция создавала сильную ссылку на него. 2. Для этого используется каверзный способ использования: typedef id (^WeakReference)(void); WeakReference MakeWeakReference (id object) { __weak id weakref = object; return ^{ return weakref; }; } id WeakReferenceNonretainedObjectValue (WeakReference ref) { if (ref == nil) return nil; else return ref (); } [arr addObject:MakeWeakReference(obj)]; id newobj = WeakReferenceNonretainedObjectValue([arr objectAtIndex:0]); 3. Используйте собственный класс WeakReference, который удерживает слабый указатель на значение. На самом деле, идеи дизайна вышеуказанных методов одинаковы. Ответ 2 Вы можете использовать NSValue valueWithNonretainedObject:, чтобы сильно сохранить значение, которое слабо ссылается на ваш целевой объект. Ответ 3 NSMutableArray *arrayStrong = [NSMutableArray arrayWithObjects: [[yourClass alloc] init], [[yourClass alloc] init], nil]; NSPointerArray *arrayWeak = [NSPointerArray weakObjectsPointerArray]; for(yourClass *obj in arrayStrong){ [arrayWeak addPointer:(__bridge void*)(obj)]; }
Ответ 1 1.NSValue + (NSValue *)valueWithNonretainedObject:(id)anObject Этот метод полезен, если вы хотите добавить объект в коллекцию, но не хотите, чтобы коллекция создавала сильную ссылку на него. 2. Для этого используется каверзный способ использования: typedef id (^WeakReference)(void); WeakReference MakeWeakReference (id object) { __weak id weakref = object; return ^{ return weakref; }; } id WeakReferenceNonretainedObjectValue (WeakReference ref) { if (ref == nil) return nil; else return ref (); } [arr addObject:MakeWeakReference(obj)]; id newobj = WeakReferenceNonretainedObjectValue([arr objectAtIndex:0]); 3. Используйте собственный класс WeakReference, который удерживает слабый указатель на значение. На самом деле, идеи дизайна вышеуказанных методов одинаковы.
Ответ 2 Вы можете использовать NSValue valueWithNonretainedObject:, чтобы сильно сохранить значение, которое слабо ссылается на ваш целевой объект.
Ответ 3 NSMutableArray *arrayStrong = [NSMutableArray arrayWithObjects: [[yourClass alloc] init], [[yourClass alloc] init], nil]; NSPointerArray *arrayWeak = [NSPointerArray weakObjectsPointerArray]; for(yourClass *obj in arrayStrong){ [arrayWeak addPointer:(__bridge void*)(obj)]; }