2013-03-02 6 views
5

В большинстве проектов до Xcode 4.4 я понял, что разработчики объявили одновременный ivar и свойство с тем же именем. ПримерЗачем нужно объявлять ivar и собственность с тем же именем?

@interface SecondViewController : UIViewController 
{ 
    NSString *string; 
} 

@property (strong, retain) NSString *string; 

Так что я не знаю почему?

+1

DUP: http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-кажется-to – justin

ответ

1

Я не могу говорить за других, но я не пользуюсь тем же именем. Если я объявляю переменную экземпляра, она имеет лидирующий знак подчеркивания, поэтому очевидно, что я имею в виду переменную экземпляра или метод setter/getter.

С помощью Xcode 4.4+ вам не нужно объявлять переменную экземпляра или вызывать @synthesize, и компилятор автоматически создаст переменную экземпляра с ведущим подчеркиванием и предоставит вам метод setter/getter.

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

Например, это взято из Начиная прошивкой 6 развития:

@interface BIDViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIButton *button; 
- (IBAction)buttonPressed:(UIButton *)sender; 
@end 

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

Что происходит, например, если с помощью класса делает это:

BIDViewController *vc = ...; 
vc.button = nil; 

или

vc.buttonPressed(mySegmentedControl); 

Все переносы ад свободно. Теперь, когда есть 1000 способов разбить программу, и мы не можем защищаться от всех из них, мы не хотим создавать уже слабую систему (Objective-C мало что дает с точки зрения определения, кто может и не может назвать один ваших методов) слабее.

выше реализация лучше проводить с использованием частных переменных и методов экземпляра, оба из которых почитаются Interface Builder:

@implementation BIDViewController() 
{ 
    IBOutlet UIButton *_button; 
} 
- (IBAction)_buttonPressed:(UIButton *)sender; 

@end 

и любые использующие классы будут иметь более жесткое время ломать эту модель.

Но, конечно, это больше думает и печатает для разработчика, и поэтому Apple представила новые функции, чтобы они могли получить то, что они хотят сделать за меньшее время (очень мало набирается, когда вы просто перетаскиваете розетку на заголовочный файл и оба сложения декларации и реализации).

+0

", так что это очевидно, если я имею в виду переменную экземпляра или метод setter/getter" - это очевидно в любом случае: 'self.foo' является свойством,' foo' является ivar. – 2013-03-02 09:31:26

+0

@ H2CO3 Простая ошибка пропустить бит 'self.' ... – trojanfoe

+0

Как вы можете видеть в этом сообщении: http://inessential.com/2010/06/28/how_i_manage_memory Автор использует ivar и свойство с тем же именем. И я не понимаю его намерения. – Proton

7

Просто вопрос стиля и используется для поведения из прошлых компиляторов.

Теперь в новом компиляторе это не требуется. Как только вы создаете свойство, за сценой создается ivar, а также синтезируется.

Компилятор синтезирует псевдоним как _propertyName, даже если вы можете изменить это поведение по умолчанию.

@interface AppDelegate : NSObject <NSApplicationDelegate>{ 
    NSString *bigString; 
} 
@property(strong)NSString *smallString; 
@end 

@implementation AppDelegate 
@synthesize smallString=bigString; 
-(void)awakeFromNib{ 
    [email protected]"hello"; 
    NSLog(@"%@",self.smallString); 
} 

@end 
+0

Это правильный ответ, +1. Речь идет не о версии Xcode, а о языке диалектной версии, которая реализована в определенной версии компилятора. – 2013-03-02 09:30:56

+0

@ H2CO3: Спасибо, И всякий раз, когда вы даете +1 мне, я чувствую себя хорошо :) –

+0

Какое значение этой строки '@synthesize smallString = bigString;' – Proton