Настройка свойств в зависимости от объекта-C
-
25-09-2019 - |
Вопрос
Одна из вещей, с которыми я борелся, во время преодоления объекта-C программирования - это понимание того, как манипулировать свойствами. Я, возможно, из моей зоны комфорта, используя правильный язык кодирования, в отличие от языков сценариев, которые я привык к, поэтому декларирование вещей в заголовках файлах и файлах реализации меня несколько заставляет меняться.
Скажем, у меня есть строка. Я хочу добавить несколько текстов в эту строку. Что я заявляю в заголовочном файле и что я делаю в файле реализации, чтобы позволить этому работать правильно, а что @Property и @synthesize?
Решение
В плохих старых днях до Objective-C 2.0 было распространено, чтобы писать Getter и Citners для ваших переменных экземпляров, например,
@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: сохранит свое новое значение и что свойство не безопасна для использования (для установки или Получить) в многопоточной среде (без другого механизма блокировки).
Другие советы
@property
- объявляет свойство с модификаторами доступа и памяти. Свойства могут быть отреагированы или readwrite, неатомическими или атомными (безопасность потока), назначают / сохранить / копию. На самом деле, вы можете объявить простые добытели и сеттера, такие как мы сделали в эпоху тигра, но объявляя @property
поможет вам определить все аспекты собственности в любое время без проверки реализации.
@синтезировать - Упрощает работу, если вам нужно простое свойство без какой-либо сложной работы в Getter и Setter. Определяет реализацию по умолчанию в соответствии с определением @property
.
Наконец, ваши вопросы о строке. Свойства не помогут здесь, если вы ищете что-то простое, скажем myObj.string += "abc"
. Отказ Это не объективный стиль и с недвижимостью или без нее, вы сделаете что-то вроде myObj.string = [[myObj string] stringByAppendingString:@"abc"]
или [[myObj string] appendString:@"abc"]
В зависимости от муравьего / неизменной природы струнного объекта.
В нижней строке: это довольно большая тема, чтобы объяснить все в одном посте. Я бы порекомендовал прочитать документацию Apple и, возможно, приобрести книгу о объекте-с. Aaron Hillegass написал один - хорошее начало для любого объекта-C и Mac OS X новичка.