Существует ли когда-нибудь потребность в классе для переопределения +alloc в Objective C?

Острота Kotlin без сторонних зависимостей:

var arr: ByteArray = stream.bufferedReader().use(BufferedReader::readText).toByteArray()

(я понимаю, вопрос о Java, но многие люди смешивают и соответствуют ему Kotlin в эти дни.)

5
задан Community 23 May 2017 в 12:14
поделиться

2 ответа

Довольно редко.

NSString - это пример класса, который переопределяет + alloc как деталь реализации. Если бы вы проверили, вы бы обнаружили, что + [NSString alloc] возвращает что-то из класса NSPlaceholderString. Это часть реализации кластера класса строки .

Вы также можете переопределить выделение из другого выделения NSZone по умолчанию. Или вы можете сыграть в трюки, например вызвать NSAllocateObject с чем-то ненулевым для extraBytes , чтобы обеспечить динамический объем пространства после ваших ivars. Например, вы можете подумать, что частный подкласс NSString, который вы обычно получаете, будет выглядеть примерно так:

@interface {
    NSUInteger length;
    unichar *data;
}

, но это не так. Это единственный блок памяти, который содержит как длину, так и символьные данные. Различные экземпляры NSString - это блоки памяти разного размера. Это то, что вы можете организовать, напрямую вызвав NSAllocateObject.

Но все это уловки и уловки. Если вы переопределите + alloc, происходит что-то особенное.

7
ответ дан 13 December 2019 в 05:39
поделиться

+ alloc не творит никакой магии, а просто вызывает метод в среде выполнения Objective-C, чтобы получить размер экземпляра класса и выделить этот объем памяти. Вы можете захотеть переопределить + alloc при написании истинного синглтона (т.е. вы хотите гарантировать, что только один экземпляр вашего класса может быть выделен). Хотя при написании одноэлементного класса редко нужно зайти так далеко, вы могли бы. В общем, вы должны переопределить + alloc , чтобы обеспечить альтернативное поведение (например, не выделять память в другой зоне, выделить другой класс, чем принимающий класс - это то, что могут делать кластеры классов), или вы можете вызвать + [super alloc] для выполнения стандартной работы, затем добавьте свои собственные настройки.

4
ответ дан 13 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: