首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标C,属性与ivars

目标C,属性与ivars
EN

Stack Overflow用户
提问于 2013-05-09 16:57:38
回答 1查看 750关注 0票数 3

我怀疑这个问题已经被提出和回答了,但我已经读了很多关于这个问题的帖子,我不是完全清楚答案。

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

代码语言:javascript
复制
@implementation ViewController {
    int someNum;
    NSObject *myObj;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-09 17:56:14

一种方法是在.m中声明类扩展

代码语言:javascript
复制
@interface MyViewController() {

NSInteger someNumber;
NSObject *myObject;

}

@end

@implementation MyViewController

-(void)someMethod {

someNumber++;

}

@end

假设使用ARC,您将获得对对象类型的强引用。这和你所做的没有什么不同。它只是更清晰地分离了接口和实现,而且还适合于Private Implementation等模式

但是,有了属性,您就有机会操作访问器,而且还可以免费获得KVC

代码语言:javascript
复制
@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

此外,还允许您重写

代码语言:javascript
复制
-(void)setMyObject:(NSObject *)aobj

-(NSObject *)myObject

或者只是访问隐式的私有ivar

代码语言:javascript
复制
[_myObject doSomethingCool]; 

_myObject.thing = something;

或者使用生成的访问器提供的KVC。

代码语言:javascript
复制
[myViewControllerInstance addObserver:someOtherObject forKeyPath:@"myObject" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]

之后,someOtherObject将收到以下形式的消息:

代码语言:javascript
复制
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

总之。你所做的没有错,但还有其他的技术和工具可以让你做更多的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16458012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档