Подтвердить что ты не робот

Синтез свойства без переменных экземпляра

Мне показалось, что я понял @property и @synthesize, но я немного экспериментировал, и я не могу понять, почему работает ниже код (что я думал, был нарушен).

Как вы можете видеть, нет переменной экземпляра, которая соответствует свойству name. Может ли Objective-C создать переменную экземпляра, если она не находит переменную экземпляра с тем же именем и типом?

Заголовок:

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject {

}

@property (copy, nonatomic) NSString *name;
-(void) print;

@end

Реализация:

#import "AddressCard.h"

@implementation AddressCard

@synthesize name;

-(void) print {
    NSLog(@"Name=%@", self.name);
}

-(void) dealloc {
    [name release];
    [super dealloc];
}

@end

Тест:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    AddressCard *ac = [[AddressCard alloc] init];
    ac.name = @"Brandon";
    [ac print];

    [ac release];

    [pool drain];
    return 0;
}
4b9b3361

Ответ 1

Быстрый ответ: "да". В Objective-C 2.0 синтезированные свойства автоматически создадут соответствующие ivars по мере необходимости.

Документация Apple содержит более подробную информацию.

Важно: Как указано Tommy (примечание:) это из устаревших документов - см. последняя информация):

В Objective-C 2.0 в любой из современных сред выполнения (то есть Intel 64bit и ARM) свойства могут быть добавлены к динамическим классам (то есть во время выполнения, но только до создания любых экземпляров - не особенно динамические по сравнению к остальной части времени выполнения). Однако это невозможно сделать ни в одной из двух старых версий (например, Intel 32bit и PowerPC). Поэтому на самом деле это не то, что вы хотите использовать при отправке программного обеспечения для Mac или во время разработки для iOS (поскольку симулятор представляет собой 32-битное приложение Intel и не может создавать переменные экземпляра во время выполнения)

Ответ 2

Вы можете опустить объявление переменной экземпляра только для 64-битной архитектуры

Ответ 3

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