Синтезирование свойства без переменных экземпляра - PullRequest
29 голосов
/ 22 декабря 2010

Мне показалось, что я понял @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;
}

Ответы [ 3 ]

25 голосов
/ 22 декабря 2010

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

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

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

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

2 голосов
/ 22 декабря 2010

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

0 голосов
/ 01 мая 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...