мы можем переопределить alloc и dealloc в цели C? - PullRequest
6 голосов
/ 29 сентября 2011

Я знаю, что это редко требуется для переопределения методов alloc или dealloc, но возможно ли это при программировании iPhone?

Ответы [ 2 ]

13 голосов
/ 29 сентября 2011

Вы действительно можете (если используете ручное управление памятью) переопределить dealloc, чтобы освободить все ресурсы, которые у вас есть (не забывая вызывать [super dealloc], когда закончите).Переопределение alloc возможно, но, как вы говорите, требуется редко.

6 голосов
/ 29 сентября 2011

Как правило, переопределение 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]] вместо == (хотя в этом есть некоторые серьезные подводные камни).

...