При условии , что (a) ваш класс и его суперклассы могут быть перезаписаны без потери памяти или ресурсов и (b) вы знаете, что ваш класс и его суперклассы init
все вернуть self
они переданы, а не ссылку на какой-то другой объект, тогда да ...
В противном случае все пойдет не так. Рассмотрим ваш redefine
метод; в теле этого метода self
- просто локальная переменная, содержимое которой инициализируется, чтобы указывать на некоторый объект. Изменение значения в этой локальной переменной не изменяет объект, на который она первоначально указывала, или значение любых других переменных, которые указывают на этот объект. Например. рассмотрим вариант:
@implementation Q
{
- (void) redefine
{
self = [[Q alloc] init]; // changes the *local* self to refer to a new object
}
...
}
...
Q *someQ = [[Q alloc] init]; // allocate an object
[someQ redefine]; // NO effect on someQ, another Q is just created and leaked
Очевидно, что это не меняет someQ
, и ваша версия также не может измениться. Ваш код будет иметь желаемый эффект тогда и только тогда, когда вы знаете, init
всегда возвращает объект, который был передан - что не гарантируется в Obj-C.