Чтобы ответить на ваш вопрос прямо, есть два времени выполнения функций, которые позволяют создавать/разрушать объект, расположенный в предварительно выделенном блоке памяти:
/**
* Creates an instance of a class at the specific location provided.
*
* @param cls The class that you wish to allocate an instance of.
* @param bytes The location at which to allocate an instance of \e cls.
* Must point to at least \c class_getInstanceSize(cls) bytes of well-aligned,
* zero-filled memory.
*/
OBJC_EXPORT id objc_constructInstance(Class cls, void *bytes)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0)
OBJC_ARC_UNAVAILABLE;
/**
* Destroys an instance of a class without freeing memory and removes any
* associated references this instance might have had.
*/
OBJC_EXPORT void *objc_destructInstance(id obj)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0)
OBJC_ARC_UNAVAILABLE;
Полностью тестировался пример использования (ARC должна быть отключена в файле @implementation):
+ (void)allocInPlace:(void *)buffer
{
objc_constructInstance(self, buffer);
}
- (void)dealloc
{
objc_destructInstance(self);
}
size_t instanceSize = class_getInstanceSize(MyClass.class);
// This may not be enough, since we need to ensure that object instances are 16-byte aligned
void *buffer = calloc(instanceSize, numObjects);
for (size_t i = 0; i < numObjects; i++) {
// Need to ensure that this is 16-byte aligned
void *objBuffer = buffer + (instanceSize * i);
[mySet addObject:[[MyClass allocInPlace:objBuffer] init]];
}
Вы будете урожденная d, чтобы висеть на buffer
и free()
, когда он больше не нужен.
Как бы то ни было, вы, возможно, должны использовать только массив C структур. Метод, который я использовал здесь, работает против стандартной практики Obj-C и подвержен ошибкам (если, например, вы освобождаете буфер до того, как все объекты были разрушены, тогда произойдет Bad Things).
Зачем вам так много экземпляров на мобильном устройстве? – Wain