Я видел следующий фрагмент кода:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Какая связь между mapView
и mapView1
?
Создает ли он метод set
и get
для mapView1
?
В вашем примере, mapView1-это *переменная* (Ивар), кусок памяти, который принадлежит экземпляр класса, определенного в Примере.H
и пример.м
. положение
имя собственность. Свойства-это атрибуты объекта, который можно прочитать или изменить с помощью точечной нотации: мой_объект.положение
. Свойство не'т у должна быть основана на Ивара, но большинство свойств. В @'declaration собственность просто говорит всему миру, что есть свойство под названием
положение`.
@синтезировать положение = mapView1;
Эта строка сообщает компилятору, чтобы создать сеттер и геттер для положение
, и что они должны использовать Ивар назвал mapView1
. Без = mapView1 часть, компилятор будет считать, что собственность и Ивар имеют одинаковое имя. (В этом случае, что приведет к ошибке компиляции, так как нет Ивар назвал
положение`.)
Результатом этого заявления@синтезировать` подобно тому, если бы вы добавили этот код:
-(MKMapView *)mapView
{
return mapView1;
}
-(void)setMapView:(MKMapView *)newMapView
{
if (newMapView != mapView1)
{
[mapView1 release];
mapView1 = [newMapView retain];
}
}
Если вы добавить этот код в класс самостоятельно, вы можете заменить оператора@синтезировать с
@динамическое положение;
Главное-иметь очень четкое концептуальное различие между Иварс и свойства. Они действительно два совершенно разных понятия.
@synthesize
создает геттер и сеттер для переменной.
Это позволяет вам указать некоторые атрибуты для ваших переменных, и когда вы @synthesize
это свойство к переменной, вы создаете getter и setter для переменной.
Имя свойства может быть таким же, как имя переменной. Иногда люди хотят, чтобы оно было другим, чтобы использовать его в init
или dealloc
или когда параметр передается с тем же именем переменной.
Из документации:
Вы используете ключевое слово @synthesize, чтобы сообщить компилятору, что он должен синтезировать методы setter и/или getter для свойства, если вы не предоставили их в блоке @implementation.
Как я только что столкнулись с этой проблемой при редактировании устаревший код, я хочу сделать дополнительные примечания к существующему ответов один должен быть в курсе.
Даже с новой версией компилятора он иногда делает разницы, если вы пропустили@синтезировать имя_свойства` или нет.
В случае, если вы объявите переменную экземпляра without подчеркнуть, а еще синтезу, таких как:
Заголовок:
@interface SomeClass : NSObject {
int someInt;
}
@property int someInt;
@end
Реализация:
@implementation SomeClass
@synthesize someInt;
@end
"я".someInt будет открыть одну и ту же переменную как someInt
. Не использовать символ подчеркивания для Иварс не следовать соглашениям об именах, но я пришел в ситуацию, где мне приходилось читать и модифицировать такой код.
Но если теперь ты думаешь, что "Эй, @синтезировать уже не важно, как мы используем более новый компилятор и" Вы не правы! Тогда ваш класс будет привести к тому, что два Иварс, а именно someInt `плюс автоматически
_someInt` переменной. Таким образом "я".someInt и someInt не будет рассматривать одни и те же переменные больше. Если вы Don'т ожидать, что такое поведение, как я сделал, может сделать вас некоторые головная боль, чтобы выяснить.
Согласно документации Apple @синтезировать используется только переименовать переменные экземпляра. Например
@property NSString *str;
@synthesize str = str2;
Сейчас в классе вы не можете использовать _str
как строку и переименовать переменную стр2
@недвижимости
позволяет объектам быть использованы объекты в других классах, или другими словами делает объект публичных.
При создании свойства в @интерфейс, это свойство будет автоматически вернуться к переменной экземпляра назван _propertyName. Поэтому, когда вы создаете свойство, как firstName, за компилятор сцена будет создать переменную экземпляра с именем как _firstName по умолчанию. Компилятор также создать геттер и сеттер для вас(т. е. имя, setFirstName).
Теперь, когда вы синтезировать свойство @синтезировать имя, вы просто сообщает компилятору переименовать мой экземпляр переменной(_firstName) на имя. Если вы хотите переименовать ваши резервные копии переменной экземпляра на другое имя, вы можете просто присвоить другое имя при синтезе имя свойства(т. е. @синтезировать имя = myFirstName), делая это ваша собственность подкреплены переменную экземпляра с именем как myFirstname.
Так, короче, большую часть времени @синтезировать используемые переименовать свой экземпляр переменной подкреплено ваше имущество.
См. документацию Apple.
В основном синтез создает методы setMapView и mapView, которые устанавливают и получают mapView1
Он создает геттер и сеттер для вашего объекта. Вы можете открыть что-то вроде этого :
MKMapView* m = object.mapView;
или
object.mapView = someMapViewObject
mapView1-имя Ивар в классе, положение называется геттер / сеттер(ы).