Во-первых, вы должны написать простой код, предназначенный для людей.
Не беспокойтесь о таких проблемах с производительностью, пока не доказали (с помощью инструментов или какой-либо другой меры), что это критическое узкое место.
Таким образом, создание определенных объектов может быть очень дорогостоящим, поэтому хранение кеша для определенных объектов само по себе не является плохим. Однако вы никогда не должны полагаться на подсчет ссылок даже в коде, отличном от 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.
}
Это плохая практика. Никогда не зависеть от keepCount. –