2013-05-09 47 views
3

我懷疑這個問題已經被提出並回答了,但是我已經閱讀了很多文章,而且我對這個答案並不完全清楚。objective C,properties vs ivars

我一般覺得很方便的聲明私有變量,實例變量中的my.m文件實現部分,像這樣:

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

這是正確的,和或當前最佳實踐?出於某種原因,我是否需要聲明屬性?

+0

在.h文件中聲明變量並將其設置爲@private是較舊的編碼方式。實際上,在你的.m實現中有這些變量是當前的行業標準。 – nik 2013-05-09 09:01:36

回答

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; 

或使用KVC由生成的訪問給你

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

之後someOtherObject將收到形式

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

在短的消息。你在做什麼並沒有錯,但還有其他的技術和工具可以用來探索你可以做更多的事情。

+0

非常好,謝謝。 – Mrwolfy 2013-05-09 10:12:22

+0

基本上使用可以提供清晰可維護代碼的樣式。如果你更喜歡公司演出。 – 2013-05-09 10:35:34