Инициализация переменных экземпляра в iPhone Development / Objective-C

Поскольку я новичок в разработке iPhone / Objective-C, я хотел задать этот вопрос, чтобы убедиться, что я собираюсь правильно инициализировать переменные экземпляра в различных сценариях. Итак, ниже я собираюсь представить несколько сценариев, и если кто-нибудь увидит, что что-то делается неправильно, могут ли они сообщить мне об этом. (Примечание: в моих примерах я буду использовать instanceVariable для переменной экземпляра, которую мы хотим инициализировать, которая является объектом класса InstanceVariableClass.)

Сценарий 1: Инициализация в классе, отличном от UIViewController

a) Новое размещение

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        instanceVariable = [[InstanceVariableClass alloc] init];
    }
    return self;
}

В инициализаторе можно получить доступ к переменной напрямую (т.е. не через ее свойство) и выделить ее. Когда вы вызываете alloc, вновь созданный объект будет автоматически сохранен, что будет отлично работать позже, когда вы будете использовать его с вашими методами получения и установки. Вы не хотите выделять переменную с помощью свойства, например self.instanceVariable = [[InstanceVariableClass alloc] init]; , иначе вы сохраните ее дважды (один раз в методе установки и один с размещением).

б) Параметр

- (id)initWithFrame:(CGRect)frame object(InstanceVariableClass*) theInstanceVariable {

    self = [super initWithFrame:frame];
    if (self) {
        instanceVariable = [theInstanceVariable retain];
    }
    return self;
}

Еще раз, OK, чтобы получить прямой доступ к вашей переменной экземпляра в инициализаторе. Поскольку вы не выделяете переменную, а просто хотите владеть копией, которая была передана вам, вам необходимо, чтобы она явно сохраняла себя.Если бы вы использовали свой метод установки, он бы сохранил его для вас, но вы хотите избежать доступа к свойствам в инициализаторе.

c) Удобный метод

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        instanceVariable = [[InstanceVariableClass returnInitializedObject] retain];
    }
    return self;
}

При использовании удобного метода для возврата нового объекта вам также необходимо явно сохранить его по тем же причинам, что и параметр. Удобный метод (если он реализован правильно) будет автоматически освобождать новый объект, который он генерирует, поэтому нам не нужно беспокоиться о его двойном сохранении.

Сценарий 2: Инициализация в классе UIViewController

a) Новое распределение

- (void) viewDidLoad // or - (void) loadView if you implemented your view programmatically
{
    [super viewDidLoad];

    InstanceVariableClass *tempInstanceVariable = [[InstanceVariableClass alloc] init];
    [self setInstanceVariable: tempInstanceVariable];
    [tempInstanceVariable release];
}

В UIViewController вы хотите выполнить инициализацию переменной экземпляра в методе viewDidLoad, чтобы применить практику ленивой загрузки или загрузки в ваши переменные только в нужный момент. Вне инициализатора прямой доступ к переменной является плохой практикой, поэтому теперь мы будем использовать наш синтезированный метод установки для установки переменной. Вы не хотите выделять переменную с помощью метода установки, например [self setInstanceVariable] = [[InstanceVariableClass alloc] init]; , иначе вы сохраните ее дважды (один раз в методе установки, и один с распределением). Поэтому лучше всего создать новую временную переменную, инициализировать временную переменную, установить переменную вашего экземпляра на временную переменную, а затем освободить временную переменную. Метод установки синтезатора сохранит переменную для вас.

b) Удобный метод

- (void) viewDidLoad // or - (void) loadView if you implemented your view programmatically
{
    [super viewDidLoad];

    [self setInstanceVariable: [InstanceVariableClass instanceVariableClassWithInt:1]];
}

Инициализируя переменную экземпляра вне метода инициализатора, мы можем просто использовать наш метод установки, чтобы установить и сохранить созданный объект.Удобный метод (если он реализован правильно) будет автоматически освобождать возвращаемый объект, поэтому нам не нужно беспокоиться о его двойном сохранении.

Это то, что у меня есть. Если кто-то может найти какие-либо недостатки в моих рассуждениях или придумать какие-либо другие сценарии, которые я забыл включить, сообщите мне. Спасибо.

7
задан Ser Pounce 3 March 2012 в 21:05
поделиться