2011-09-18 2 views
3

Можно создать дубликат:
Property Declaration and Automatic Backing Storage AllocationIOS - Objective C - Вопрос о свойствах

Я довольно новыми для Objective-C, и я хотел бы задать основной вопрос. Я пытаюсь выяснить, в чем разница между этими двумя следующими примерами:

@interface MyViewController : UIViewController { 

     UIImageView *myImageView; 
    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

и:

@interface MyViewController : UIViewController { 

    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

Что такое правильный подход? Я знаю использование свойств и то, что означает свойство. Вопрос в том, какова разница первого примера со вторым? Есть ли разница в памяти?

Спасибо заранее,

Andreas

+0

Среди многих других. Пожалуйста, сделайте поиск - есть много хорошей информации об этом уже доступном: http://stackoverflow.com/search?page=2&tab=relevance&q=%5bobjc%5d%20declare%20ivar%20property –

ответ

8

В первом примере используется явная опорная переменная для свойства. То есть: вы определили опорную переменную и можете получить к ней доступ напрямую.

Во втором примере Objective-C неявно создает для вас опорную переменную. Поскольку вы не знаете его имя, вы не можете получить к нему доступ напрямую.

Однако, вы можете сказать, Objective-C, как назвать его:

@synthesize myImageView = myImageViewVariable; 

Теперь вы можете получить доступ к myImageViewVariable непосредственно. Вы также можете использовать тот же синтаксис, если хотите использовать другую опорную переменную. Например, я предпочитаю делать это таким образом:

@interface Foo : NSObject { 
    Bar *baz_; 
} 

@property (nonatomic, retain) Bar *baz; 
@end 

@implementation Foo 
@synthesize baz = baz_; 
@end 

Это дело вкуса, я просто хотел бы иметь другое имя для переменной основы. Мне не нужно было объявлять его явно, но мне не нравятся неявные действия.

+0

Здесь, в примере, какой будет myImageViewVariable? Я имею в виду, что у меня есть myImageView, и вы создаете его с помощью myImageViewVariable. Почему тогда вы получаете доступ к myImageViewVariable, а не myImageView, который является вашей собственностью? – andreasv

+0

В моем примере, вы можете получить доступ к любой собственности ('self.myImageView'), или вы можете получить доступ к переменной подкладочный непосредственно (' myImageViewVariable'). – DarkDust

+0

Преимущество доступа к собственности заключается в том, что она более надежна, когда вы выполняете подкласс, такие вещи, как сохранение, позаботятся. Доступ к резервной переменной выполняется немного быстрее (вызов метода не выполняется), но недостатком является то, что при подклассификации это проблематично, и вам также нужно самому управлять памятью. Смешивание методов доступа в порядке, кстати. Например: 'self.property = newObject; [self doSomething: propertyBackingVariable]; ' – DarkDust

2

Второй подход использует динамический Ивар. Смотрите эту замечательную статью: http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

+0

, так что все понятно. Очевидно, что второй метод, насколько я понял из статьи, лучше особенно для случаев, когда у вас есть множественное наследование между вашими классами. Если контроллер, который я показываю в приведенном выше примере, является последним ребенком, каким будет правильный подход. Я предполагаю, что я понял, что они оба одинаковы! – andreasv

+0

... пока вы не хотите писать обратный код, считайте их одинаковыми. – vikingosegundo

+0

Является ли Apple какой-либо проблемой для этих подходов для представления iPhone App? Я имею в виду, есть ли способ, который может привести к отторжению, и я должен следовать определенной схеме? – andreasv

1

Второй требует современного выполнения - что IOS и 64-разрядного Mac OS X

Вы можете определить резервное хранилище, когда вы @synthesize свойства в реализации.

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