@property @synthesize - PullRequest
       2

@property @synthesize

10 голосов
/ 09 января 2010

Что @synthesize и @property делают в XCode? Пожалуйста, предоставьте объяснение в действительно простых терминах?

Ответы [ 6 ]

16 голосов
/ 09 января 2010

Вы просили простые термины:

@ property объявляет недвижимость в вашем заголовок класса

@property (nonatomic, retain) NSString *myString;

@ synthesize создает ваш сеттер и добытчик для вашей собственности (аксессор методы)

Без синтеза вы должны написать ваш собственный сеттер и геттер реализация, как getMyString или setMyString (заглавная характер вашей собственности)

Сэм: Просто совет: http://www.cocoadevcentral.com/d/learn_objectivec/ - довольно солидный ресурс для изучения таких основ, как свойства.

Удачи!

6 голосов
/ 09 января 2010

Свойства и синтезированные средства доступа являются новыми функциями в Objective-C 2.0.

Когда вы объявляете @property, вы несколько объявляете экземпляр var.Затем вы @synthesize методы доступа (т. Е. Метод получения и установки) для этого свойства.

Есть также методы доступа @dynamic, если вы заинтересованы.,У Apple есть отличный PDF для этого.

2 голосов
/ 30 сентября 2012

Думайте обо всей магии target-c как о «более умном макросе», как о «более умном утверждении #define» @property, если вы заметили, всегда находится в файле h, @synthesize всегда находится в файле m. Так на заднем плане @property (что угодно) NSString * myString;

становится объявлением 2 методов и закрытой переменной;

void set_myString:(NSString *) str;
(NSString*) get_myString;

объявлений в заголовочном файле

чтобы заставить их что-то делать, их реализация добавляется в файл m при вводе @synthesize myString; который становится чем-то вроде void set_myString: (NSString *) str { myString = str; }

(NSString *) get_myString
{
  return (myString);
}

Но это умнее, чем это в зависимости от того, говорите ли вы «сохранить», «сильный» или «слабый» он либо просто возвращает указатель на myString, либо копирует myString в новый объект

Так что все это делается автоматически компилятором, просто читая ваши объявления. Что весьма полезно и экономит много времени

0 голосов
/ 07 июля 2014

На самом деле свойства синтезируются, неявно или явно. Свойства неявно синтезируются. Так что нет необходимости использовать синтезированный, если вы не хотите изменить имя переменной на что-то отличное от _property_name.

Существуют и другие варианты использования, например, если вы не хотите, чтобы переменная экземпляра поддерживала ваше свойство.

Свойства явно синтезируются с использованием директивы @synthesized.

(Ответ взят из руководства Ранчо Большого Ботаника)

0 голосов
/ 05 декабря 2013

просто устанавливает setter имя переменной свойства в своем собственном классе.Например, допустим, у меня есть это: @property (nonatomic, copy) NSArray* viewControllers;

Хорошо, если я хочу получить доступ к установщику _viewController, я бы не стал устанавливать переменную синтеза.но если я хочу получить доступ к переменной viewController по имени viewController вместо _viewController, я бы сделал @synthesize viewController;.

Если бы я хотел использовать его как совершенно другое имя, я мог бы сделать это @synthesize viewControllers = viewControlololer;, но это только сеттер.Как вы заметите, [self viewControllers] работает только, а не [self viewControlololer];

Так что я не понимаю, почему все пишут "устанавливает и получает" свойство.Он вообще не меняет переменную-получателя ... если только это не означает, что [self viewController] знает о viewControlololer (очевидно).

0 голосов
/ 08 ноября 2011

По умолчанию все наши переменные являются частными, поэтому мы не можем выйти из класса. если мы хотим использовать нашу переменную экземпляра вне класса. Когда вы объявляете @property, вы несколько объявляете экземпляр var. Затем вы @synthesize методы доступа (то есть, getter и setter) для этого свойства.

Есть также @dynamic аксессоры, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...