2012-06-12 3 views
0

Я следую за Программой iOS от Big Nerd Ranch от Joe Conway, и я был озадачен, когда увидел следующий код.Объявление @property без @synthesizing

WebViewController.h

#import <Foundation/Foundation.h> 
@interface WebViewController : UIViewController 
@property (nonatomic, readonly) UIWebView *webView; 
@end 

WebViewController.m

#import "WebViewController.h" 

@implementation WebViewController 
- (void)loadView 
{ 
    // Create an instance of UIWebView as large as the screen 
    // Tell web view to scale web content to fit within bounds of webview 
} 

- (UIWebView *)webView 
{ 
    return (UIWebView *)[self view]; 
} 
@end 

В случае, если не один синтезирует свойство объявлен в файле .h? Xcode также не выдавал предупреждения (которое обычно делает, когда я объявляю свойство с синтезом).

Кстати, в книге, он также отметил,

В WebViewController.h добавьте свойство (но не переменную экземпляра)

Не объявляя свойство автоматически генерировать переменная экземпляра для вас? Дайте мне знать, что я пропустил. Благодарю.

ответ

3

Это потому, что метод getter «webView» реализован в файле .m, и из-за этого «@synthesize» не требуется.

Если метод «webView» не был явно создан в коде, тогда компилятор будет жаловаться на не синтезируемое свойство. Синтезируя свойство «только для чтения», в этом случае будет создавать только метод «getter», который будет делать примерно то же самое, что вы видите в коде там.

И да, по Apple docs on declared properties, он говорит, что это о «@synthesize»:

Вы можете использовать директиву @synthesize, чтобы сообщить компилятору, что он должен синтезировать сеттер и/или геттер методы для свойства если вы не поставляете их в блоке @implementation. Директива @synthesizeтакже синтезирует соответствующий экземпляр переменной , если она не объявлена ​​иначе.

+0

Я вижу! Большое вам спасибо за вашу помощь! Не могу поверить, что я пропустил геттер. – revolver

+0

Последняя версия XCode автоматически синтезирует свойства для вас –

5

Это хороший вопрос, и я думаю, что ответ немного утончен и часто не является непосредственным для людей, начинающих с Objective-C. Прежде всего, давайте развеем миф о свойствах. Миф таков:

Объективные свойства C связаны с переменными экземпляра.

Это не обязательно так. Это часто true, но не верно в каждом случае. Вот что верно:

Свойство Objective-C объявляет поглотитель и метод установки

(или в случае readonly собственности, просто геттер). В частности, когда вы объявляете свойство, называемое foo (для обсуждения предположим, что он не только для чтения), единственное, что вы действительно делаете, это сообщить компилятору, что класс, который вы пишете, имеет метод под названием -foo и метод, называемый -setFoo:.Добавляя объявление @synthesize foo; в файл .m, вы сообщаете компилятору, что они сами генерируют эти методы. Здесь вы говорите: «Компилятор, создайте переменную экземпляра (также называемую foo) и создайте реализации для моих методов -foo и setFoo:, которые обращаются к этой переменной экземпляра. В частности, верните значение этой переменной в -foo и установите значение переменной в -setFoo:.

Примечание, не нужно иметь компилятор синтезировать методы для вас. Скорее всего, вы можете написать -foo и -setFoo: себя. Кроме того, вы никоим образом не требуется, чтобы создать переменную экземпляра для поддержки использование этих методов. Вы можете написать их, как хотите.

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

+0

Спасибо за объяснение! – revolver

+0

Почему свойства set/get по-прежнему работают без синтеза? – GeneCode

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