2010-09-28 4 views
1

Одна из вещей, с которыми я боролся, одновременно вступая в программирование Objective-C, понимает, как манипулировать свойствами. Возможно, я вышел из своей зоны комфорта, используя правильный язык кодирования, а не языки сценариев, к которым я привык, поэтому объявление вещей в файлах заголовков и файлах реализации несколько сбивает меня с толку.Установки свойств Снято в Objective-C

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

ответ

2

В плохие старые дни перед 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: сохранит новое значение и что свойство не является безопасным для использования (для установки или) в многопоточной среде (без какого-либо другого механизма блокировки).

1

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

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

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

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