Я видел следующий фрагмент кода:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Какая связь между mapView
и mapView1
? Это создает set
и get
метод для mapView1
?
iphone
objective-c
Хоанг Дуй Нам
источник
источник
Ответы:
В вашем примере
mapView1
это переменная экземпляра (ivar), часть памяти, которая принадлежит экземпляру класса, определенного вexample.h
иexample.m
.mapView
это имя свойства . Свойства являются атрибутами объекта , которые могут быть считаны или установлены с помощью точечной нотации:myObject.mapView
. Свойство не обязательно должно быть основано на иваре, но большинство свойств.@property
Декларация просто говорит миру , что есть свойство называетсяmapView
.@synthesize mapView = mapView1;
Эта строка говорит компилятору создать для сеттера и геттера
mapView
, и что они должны использовать вызываемый ivarmapView1
. Без= mapView1
части компилятор предположил бы, что свойство и ivar имеют одно и то же имя. (В этом случае это приведет к ошибке компилятора, поскольку не вызывается ivarmapView
.)Результат этого
@synthesize
утверждения аналогичен тому, если вы добавили этот код самостоятельно:Если вы добавите этот код в класс самостоятельно, вы можете заменить
@synthesize
выражение на@dynamic mapView;
Главное, чтобы было очень четкое концептуальное различие между иварами и свойствами. Это действительно две совершенно разные концепции.
источник
@synthesize
создает геттер и сеттер для переменной.Это позволяет вам указать некоторые атрибуты для ваших переменных, а когда вы присваиваете
@synthesize
это свойство переменной, вы генерируете метод получения и установки для переменной.Имя свойства может совпадать с именем переменной. Иногда люди хотят, чтобы это было отличается тем, чтобы использовать его в
init
илиdealloc
или когда параметр передается с именем того же переменной.источник
Из документации :
источник
Поскольку я только сталкиваюсь с этой проблемой при редактировании старого кода, я хочу сделать дополнительные примечания к существующим ответам, о которых нужно знать.
Даже с более новой версией компилятора это иногда имеет значение, если вы пропустите
@synthesize propertyName
или нет .В случае, если вы объявляете переменную экземпляра без подчеркивания, все еще синтезируя ее, например:
Заголовок:
Реализация:
self.someInt
получит доступ к той же переменной, что иsomeInt
. Отсутствие начального подчеркивания для ivars не соответствует соглашениям по именованию, но я просто попал в ситуацию, когда мне пришлось читать и изменять такой код.Но если вы теперь думаете: «Эй, @synthesize больше не важен, так как мы используем более новый компилятор», вы ошибаетесь! Ваш класс будет иметь два ивара , а именно
someInt
плюс автоматически сгенерированную_someInt
переменную. Таким образомself.someInt
иsomeInt
больше не будут обращаться к одним и тем же переменным. Если вы не ожидаете такого поведения, как я, это может привести к головной боли.источник
@synchronize
является директивой о том, как синхронизировать потоки при доступе к свойству и@synthesize
предназначена для привязки свойства к переменной экземпляра через методы получения и установки.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
. (Я не знаю, в какой версии xcode было добавлено это предупреждение.)Согласно документации Apple, @Synthesize используется только для переименования переменных экземпляра. Например
Теперь в классе вы не можете использовать,
_str
поскольку вышеприведенная строка переименовывает переменную экземпляра вstr2
@property
позволяет объектам использоваться объектами в других классах или другими словами делает объект общедоступным.источник
Когда вы создаете свойство в @interface, это свойство будет автоматически возвращено переменной экземпляра с именем _propertyName. Поэтому, когда вы создаете свойство с именем firstName, за компилятором сцены по умолчанию создается переменная экземпляра с именем _firstName. Компилятор также создаст для вас метод получения и установки (то есть firstName, setFirstName).
Теперь, когда вы синтезируете свойство с помощью @synthesize firstName, вы просто указываете компилятору переименовать мою переменную экземпляра (_firstName) по firstName. Если вы хотите переименовать вашу резервную копию переменной экземпляра под другим именем, вы можете просто присвоить другое имя при синтезировании имени свойства (т. Е. @Synthesize firstName = myFirstName), выполнив это действие, чтобы создать резервную копию переменной экземпляра с именем myFirstname.
Итак, короче говоря, большую часть времени @synthesize использовал для переименования вашей переменной экземпляра, сохраняемой вашим свойством.
источник
Посмотреть яблочные документы
В основном синтез создает методы setMapView и mapView, которые устанавливают и получают mapView1.
источник
Он создает геттер и сеттер для вашего объекта. Вы можете получить доступ с чем-то вроде этого:
или
mapView1 - это имя ivar в классе, mapView - имя для метода (ов) получения / установки.
источник