objective-c - Objective-C ,属性与 ivars

标签 objective-c properties instance-variables

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

我通常发现在 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/

相关文章:

python - 实例变量 Python 的类型提示约定

ruby-on-rails - 在rails中,在哪里放置一个根据当前日期变化的常量(变量?)?

iphone - 用于游戏以外的应用程序的 GameKit

Objective-C:如何检查一个类是否被一个类别扩展?

c# - 覆盖子类中的字段或属性

iphone - 原子属性在什么情况下有用?

java - 我应该如何在 Java 中初始化一个复杂的实例变量?

iphone - 图像没有移回正确的位置

ios - 如何用代码复制iOS提醒应用程序图形背景

java - 包含带有标记的值的 XML 属性文件