Вопрос

Одна из вещей, с которыми я борелся, во время преодоления объекта-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 новичка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top