目标C,属性vs ivars

时间:2013-05-09 08:57:38

标签: objective-c properties instance-variables

我怀疑这个问题已经被问及并回答了,但我已经阅读了很多帖子,我对答案并不完全清楚。

我通常觉得在my.m文件的实现部分中将私有变量声明为实例变量非常方便,如下所示:

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

这是正常的,还是目前的最佳做法?我是否需要出于某种原因而声明属性?

1 个答案:

答案 0 :(得分: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

或只是访问隐式私有ivar

[_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

简而言之。你正在做的事情没有错,但还有其他技术和工具可以探索,你可以做更多的事情。

相关问题