2013-05-09 3 views
3

Я подозреваю, что этот вопрос задан и ответил, но я прочитал много сообщений об этом, и я не совсем понял ответ.Объектив C, свойства vs ivars

я обычно нахожу это весьма удобно объявить частные переменные как переменные экземпляра в разделе реализации my.m файлов следующим образом:

@implementation ViewController { 
    int someNum; 
    NSObject *myObj; 
} 

Это нормально, и или лучшая практика в настоящее время? Мне почему-то нужно объявлять свойства по какой-то причине?

+0

Объявление переменных в файле .h и создание его как @private - это более старый способ кодирования. Имейте эти переменные в вашей реализации .m на самом деле, это текущий отраслевой стандарт. – nik

ответ

3

Один метод, чтобы объявить расширение класса в .m

@interface MyViewController() { 

NSInteger someNumber; 
NSObject *myObject; 

} 

@end 

@implementation MyViewController 

-(void)someMethod { 

someNumber++; 

} 

@end 

Предполагая, что ARC вы получите сильные ссылки с типами объектов. Это не отличается от того, что вы делали. Его просто разделяющий интерфейс и реализация более четко и также поддаются таким узорам, как Private Implementation

Однако со свойствами вы получаете возможность манипулировать аксессуарами, а также получаете KVC.

@interface MyViewController() { 

    NSInteger someNumber; 

} 

@property (copy,readwrite,nonatomic) NSObject *myObject; 

@end 

@implementation MyViewController 

-(void)someMethodWhichNeedsACopy:(NSObject *)aobj { 

self.myObject = aobj; //free copies , no smudging! 

} 

@end 

И в дополнение позволяет переопределить

-(void)setMyObject:(NSObject *)aobj 

-(NSObject *)myObject 

или просто получить доступ к неявной частному Ивар

[_myObject doSomethingCool]; 

_myObject.thing = something; 

или использовать КВЦ дано вам сгенерированных аксессорах

[myViewControllerInstance addObserver:someOtherObject forKeyPath:@"myObject" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL] 

после w hich someOtherObject будет получать сообщения от формы

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

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

+0

Очень приятно, спасибо. – Mrwolfy

+0

В основном используйте стиль, который дает вам понятный код для поддержки. Если вы еще в корпоративном концерте. –

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