Как правило, переопределение alloc
выполняется только тогда, когда вы хотите, например, выделить объект из пула доступных экземпляров или, возможно, выделить переменный объем памяти для объекта на основе какого-либо внешнего параметра. (В C ++ вы можете получить доступ к параметрам new
и распределить их на основе, но Objective-C не дает вам доступа к параметрам initXXX
.)
Я никогда не пытался ничего подобного, и я подозреваю, что это что-то вроде минного поля - вам нужно изучить структуры и быть довольно осторожными.
Как сказал Адам, вы должны ВСЕГДА (в среде с подсчетом ссылок) переопределять dealloc
, если в вашем объекте есть какие-либо сохраненные объекты.
Обновление: Интересная вещь, которую вы можете сделать ... в RedClass или суперклассе этого кода, наподобие:
+(id)alloc {
if (self == [RedClass class]) {
return [BlueClass alloc];
}
else {
return [super alloc];
}
}
Чистый результат заключается в том, что всякий раз, когда вы выполняете [RedClass alloc]
, возвращается объект BlueCLass. (Примечание: предположительно BlueClass является подклассом RedClass, иначе все будет серьезно испорчено вскоре после возвращения объекта.)
Не говорю, что это хорошая идея, но это возможно (и я не знаю ничего о случаях, когда это не будет надежно работать для ванильных пользовательских классов). И у него есть несколько возможных применений.
Дополнительное примечание: В некоторых случаях может потребоваться использовать [self isSubclassOf:[RedClass class]]
вместо ==
(хотя в этом есть некоторые серьезные подводные камни).