2012-11-21 2 views
0

У меня есть пул объектов, которые я храню внутри NSMutableArray, поэтому, если любые другие объекты хотят ссылаться на них вместо создания новых объектов, я просто дам ссылку на объект, который я уже создал.Пулы ARC NSMutableArray

В прошлом я бы отслеживал вызовы сохранения/освобождения этих объектов, и когда они достигли значения удержания 1 (только моего массива), я бы удалил их из массива. Однако я изо всех сил стараюсь сделать это с помощью ARC, потому что он не позволяет мне отслеживать сохранение/выпуск, как я буду заниматься этим?

+0

Это плохая практика. Никогда не зависеть от keepCount. –

ответ

1

Создание способа управления объектами на основе выпуска/сохранения вызовов, это опасно. Если Apple изменит способ работы, вы ввернуты. И, судя по всему, это то, что произошло, когда вы начинаете использовать ARC. Есть две вещи:

1) Вы хотите сохранить объекты внутри NSMutableArray независимо, если они используются другими объектами или нет. В этом случае просто создайте ссылку на эти объекты __weak, и таким образом ваш объект, находящийся внутри NSMutableArray, будет сохранен в живых.

2) Как только нет ссылок на объект, просто удалите его с NSMutableArray. Добавить в NSMutableArray a __weak объект. Как только strong будет выпущен, тот будет внутри массива, хотя мне не очень нравится этот подход, поскольку я нахожу его опасным. Если вы идете на этот вариант, использовать для хранения объектов:

NSValue *weakObject = [NSValue valueWithNonretainedObject:anObject]; 
[array addObject:weakObject]; 

В конце концов, вы можете просто удалить ARC из этого конкретного файла, и вы можете сохранить контроль.

+0

Существует различие между «слабым» и «невыполненным». –

+0

Не могли бы вы объяснить, пожалуйста? – Peres

+0

не удерживаемые средства ...'keep' не вызывается. Это очень отличается от «слабого», когда ссылка обнуляется, когда объект освобождается. –

0

Я бы не стал беспокоиться о такой сложной системе. Просто работайте с сильными и слабыми свойствами и не пытайтесь выполнить вторую оценку. Вы пытаетесь самостоятельно создать систему управления памятью, которая не имеет никакого отношения к ARC. Создание и удаление объектов - это, как правило, крошечный процент производительности любого объектно-ориентированного приложения; после многих лет использования инструментов для контроля производительности я больше не беспокоюсь об этой части.

0

Во-первых, вы должны написать простой код, предназначенный для людей.

Не беспокойтесь о таких проблемах с производительностью, пока не доказали (с помощью инструментов или какой-либо другой меры), что это критическое узкое место.

Таким образом, создание определенных объектов может быть очень дорогостоящим, поэтому хранение кеша для определенных объектов само по себе не является плохим. Однако вы никогда не должны полагаться на подсчет ссылок даже в коде, отличном от ARC. В документах Apple очень четко сказано об этом.

Альтернатива, как указал Джеки, является слабой ссылкой. К сожалению, вы не можете поместить ссылку weak в стандартные коллекции (хотя, как это ни парадоксально, вы можете поместить их в коллекции C++, и они будут правильно управляться).

Однако вы можете создать простой класс-оболочку для хранения слабой ссылки.

@interface WeakWrapper : NSObject 
@property (readonly) id object; 
- (id)initWithObject:(id)object; 
@end 

@implementation WeakWrapper { 
    __weak id _object; 
} 
- (id)object { 
    return _object; 
} 
- (id)initWithObject:(id)object { 
    if (self = [super init]) { 
     _object = object; 
    } 
    return self; 
} 
@end 

Вы можете поместить эти объекты в коллекции, а затем ...

WeakWrapper *wrapper = // get the object from the collection 
id object = wrapper.object; 
if (nil == object) { 
    // You know the object that was being referenced no longer exists 
    // so this wrapper can be removed from the collection and destroyed. 
} 
Смежные вопросы