Какой смысл @property и @synthesize? - PullRequest
5 голосов
/ 03 июля 2010

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

Заранее спасибо!

Ответы [ 4 ]

13 голосов
/ 03 июля 2010

Руководство по программированию в Objective-C Runtime: объявленные свойства

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

@property float value;

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

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

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

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

  • @property добавляет член к общедоступному интерфейсу, который действует как переменная данных для ваших клиентов класса, но читается и записывается с использованием методов.Это дает вам лучший контроль над данными, которые обмениваются между клиентом и вашим кодом, например, вы можете выполнить расширенную проверку значений, заданных вашим кодом.
  • @synthesize позволяет вам не писать явно код, который будет вызываться клиентом, и фактически обрабатывать свойство как переменную данных самостоятельно.
3 голосов
/ 25 мая 2012

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

@ 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

3 голосов
/ 03 июля 2010

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

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

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

Атрибуты объявления свойства

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

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

0 голосов
/ 03 июля 2010

Просто краткий пример того, почему вы можете не захотеть делать просто "variable = 0":

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

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

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

self.theDelegate = newObject;

На самом деле произошло следующее:

[self setTheDelegate:newObject];

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

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

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

...