我怀疑这个问题已经被问到并得到了回答,但我已经阅读了很多关于它的帖子,但我对答案并不完全清楚。
我通常发现在 my.m 文件的实现部分将私有(private)变量声明为实例变量非常方便,如下所示:
@implementation ViewController {
int someNum;
NSObject *myObj;
}
这样可以吗,或者目前的最佳实践?我是否需要出于某种原因声明属性?
最佳答案
一种技术是在 .m
中声明一个类扩展
@interface MyViewController() {
NSInteger someNumber;
NSObject *myObject;
}
@end
@implementation MyViewController
-(void)someMethod {
someNumber++;
}
@end
假设 ARC
您将获得对对象类型的强引用。那和你做的没什么不同。它只是更清楚地分离接口(interface)和实现,也适用于 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
或者只是访问隐式私有(private)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
简而言之。您所做的并没有错,但还有其他技术和工具可供探索,您可以使用它们做更多的事情。
关于objective-c - Objective-C ,属性与 ivars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458012/