2010-07-03 2 views

ответ

13

Objective-C Runtime Programming Guide: Declared Properties

@property объявляет добытчик и методы сеттера для публичной собственности вы хотите реализовать. Например, это свойство декларация:

@property float value; 

эквивалентна:

- (float)value; 
- (void)setValue:(float)newValue; 

@synthesize обеспечивает реализацию по умолчанию для этих двух аксессоров.

Обновление: Вышеописанное объясняет, что они делают. Это не объясняет, какова их цель. :-)

  • @property добавляет элемент в открытом интерфейс, который действует в качестве переменных данных для ваших клиентов класса, но считывается и записывается с использованием методов. Это дает вам лучший контроль над данными, которые обмениваются между клиентом и вашим кодом, например, вы можете выполнить расширенную проверку на значения, предоставленные вашим кодом.
  • @synthesize позволяет явно не писать код, который будет вызываться клиентом, и фактически обрабатывать свойство как переменную данных самостоятельно.
+0

Я не знаю, понял ли я это ... почему бы просто не сделать: value = 0.0; – esqew

+0

@ seanny94 Посмотреть этот вопрос: http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

+0

Ответ частично ошибочен. @property объявляет getter (и/или setter). Он также объявляет некоторые аспекты поведения геттера/сеттера (например, сохранение, копирование, назначение, неатомический). @synthesize предоставляет стандартную реализацию аксессуаров (ов) на основе @property. Ни одно из них не позволяет вам рассматривать свойство как элемент данных больше, чем писать стандартные декларации и определения методов. – JeremyP

0

Просто быстрый пример того, почему вы не можете сделать просто «переменная = 0»:

Скажем у вас есть это свойство:

@property (nonatomic, retain) id <MyDelegate> theDelegate; 

Всякий раз, когда вы заменить этот делегат с новым один, ваши синтезированные сеттеры и геттеров будет обрабатывать релиз/сохранить для вас каждый раз, когда вы его, как так:

self.theDelegate = newObject; 

Действительно, что HAP pened был такой:

[self setTheDelegate:newObject]; 

- (void)setTheDelegate:(id <MyDelegate>)anObject { 
    [theDelegate release]; 
    theDelegate = [anObject retain]; 
} 

(Это упрощена конечно)

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

3

Символ «@» интерпретируется компилятором как директива. Это одно из «добавлений Objective-C» к языку C. Когда вы объявляете @property, а затем @synthesize, вы инструктируете компилятор для создания инструкций и соответствующих символов для геттеров и сеттеров для вас. Помните, что на языке C оператор «=» означает «присваивать». В большинстве случаев в контексте OO, который предоставляют расширения Objective-C, мы работаем с указателями (также ссылки) на структуры данных isa (классы в Objective-C).

До цели-C 2.0, все методы getter и setter должны были быть закодированы разработчиком для каждого атрибута, который для большинства случаев был кодом копирования/вставки. Чтобы быть полностью совместимым с KVC/KVO, требуется много очень утомительного кода ... willAccessValueForKey, didUpdateValueForKey и т. Д., Что новый компилятор добавляет для вас автоматически при использовании синтаксиса @ property/@ synthesize. Это огромный прирост производительности для разработчиков. Синтаксическая точка дополнения к языку немного более спорным в сообществе, поскольку это скрывает магии компилятор делает на вас от имени интерпретировать object.property = anotherObject.property; заявления как [object setProperty:[anotherObject property]];

Из документации Apple, ссылка в других ответах

Декларация собственности атрибуты

Вы можете декорировать свойство с атрибутами, используя форму @property (атрибут [, attribute2, ...]). Подобно методам, свойства привязаны к объявлению интерфейса. Для объявлений свойств, которые используют список имен переменных с разделителями-запятыми, атрибуты свойств применяются ко всем именованным свойствам.

Если вы используете директиву @synthesize, чтобы сообщить компилятору о создании метода (ов) доступа, код, который он создает, соответствует спецификации, заданной ключевыми словами. Если вы сами внедряете метод (ы) доступа, вы должны убедиться, что он соответствует спецификации (например, если вы указываете копию, вы должны убедиться, что скопируете входное значение в методе setter).

3

Надеюсь, это поможет вам.

@property и @synthesize используется для доступа к объекту или переменной в другой класс.

Вот небольшой пример: Это первый класс

#import <UIKit/UIKit.h> 
#import "ClassB.h" 
@interface ViewController : UIViewController 
@property(nonatomic, retain) NSString *FirstName; 
@property(nonatomic, retain) NSString *LastName; 


#import "ViewController.h" 
@interface ViewController() 
@end 
@implementation ViewController 
@synthesize FirstName, LastName; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstName = @"Ashvin"; 
    self.LastName = @"Ajadiya"; 
    ClassB *ClassBOb = [[ClassB alloc] init]; 
    ClassBOb.ViewCntrlrOb = self; 
    [ClassBOb CallMe]; 
} 
@end 

И это еще один класс:

#import <UIKit/UIKit.h> 
@class ViewController; 
@interface ClassB : UIViewController 
@property(nonatomic, retain) ViewController *ViewCntrlrOb; 
-(void) CallMe; 
@end 

#import "ClassB.h" 
#import "ViewController.h" 
@interface ClassB() 
@end 
@implementation ClassB 
@synthesize ViewCntrlrOb; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

-(void) CallMe 
{ 
    NSLog(@"FirstName = %@",ViewCntrlrOb.FirstName); 
    NSLog(@"LastName = %@",ViewCntrlrOb.LastName); 
} 

Так что вы можете получить доступ к FirstName и LastName в ClassB.

И они печатают:

2012-05-25 14: 38: 10.766 MyExample [8751: c07] FirstName = Ashvin 2012-05-25 14: 38: 10.768 MyExample [8751: c07] LastName = Ajadiya

Смежные вопросы