Задание краткого описания свойств в Objective-C - PullRequest
1 голос
/ 28 сентября 2010

Одна из вещей, с которыми я боролся, когда врывалась в программирование на Objective-C, это понимание того, как манипулировать свойствами.Возможно, я вышел из своей зоны комфорта, используя надлежащий язык кодирования, а не языки сценариев, к которым я привык, поэтому объявление вещей в заголовочных файлах и файлах реализации несколько сбивает меня с толку.есть строкаЯ хочу добавить текст в эту строку.Что я объявляю в заголовочном файле и что я делаю в файле реализации, чтобы позволить этому работать должным образом, и что такое @property и @synthesize?

Ответы [ 2 ]

2 голосов
/ 28 сентября 2010

В старые добрые времена, предшествовавшие Objective-C 2.0, было принято писать геттеры и сеттеры для переменных вашего экземпляра, например

@interface Foo : NSObject
{
@private 
    id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end

@implementation Foo

// need dealloc to release foo too.

-(void) setFoo: (id) newFoo
{
    [newFoo retain];
    [foo release];
    foo = newFoo;
}

-(id) foo
{
   return foo;
}
@end

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

Свойства обеспечивают аккуратное сокращение для вышеупомянутого. @Property заменяет оба объявления в интерфейсе, а также дает вызывающей стороне лучшие подсказки о семантике getter и setter. Это также позволяет вам @synthesize средства доступа, чтобы компилятор автоматически генерировал для них код (у вас нет для @synthesize их, вы можете предоставить свои собственные реализации, если хотите). Все вышеперечисленное можно заменить на

 @interface Foo : NSObject
{
@private 
    id foo;
}
@property (nonatomic, retain) id foo;
@end

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end

Это экономит много времени при наборе, но вы также можете видеть из интерфейса, что setFoo: сохранит свое новое значение и что это свойство небезопасно использовать (для установки или get) в многопоточном режиме. окружение (без какого-либо другого механизма блокировки).

1 голос
/ 28 сентября 2010

@property - объявляет свойство с модификаторами доступа и памяти.Свойства могут быть только для чтения или чтения, записи, неатома или атома (потокобезопасность), назначать / сохранять / копировать.На самом деле, вы можете объявить простые методы получения и установки, как мы делали в эпоху Тигра, но объявление @property поможет вам идентифицировать все аспекты свойства в любое время без проверки реализации.

@ synthesize - упрощает работу, если вам нужно простое свойство без какой-либо сложной работы в методах получения и установки.Он определяет реализацию по умолчанию в соответствии с определением @property.

Наконец, ваши вопросы о строке.Свойства здесь не помогут, если вы ищете что-то простое, скажем, myObj.string += "abc".Это не стиль Objective-C, и со свойством или без него вы будете делать что-то вроде myObj.string = [[myObj string] stringByAppendingString:@"abc"] или [[myObj string] appendString:@"abc"] в зависимости от изменчивой / неизменной природы строкового объекта.

В итоге: это довольно большая темаобъяснить все в одном посте.Я бы порекомендовал вам прочитать документацию Apple и, возможно, купить книгу о Objective-C.Аарон Хиллегасс написал один - хорошее начало для любого новичка в Objective-C и Mac OS X.

...