3

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

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

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

这可以吗,或者目前的最佳做法?出于某种原因,我是否需要声明属性?

4

1 回答 1

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

简而言之。您所做的并没有错,但是还有其他技术和工具可以探索,您可以使用它们做更多的事情。

于 2013-05-09T09:56:14.083 回答