首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候应该在头文件中声明实例变量而不是属性?

什么时候应该在头文件中声明实例变量而不是属性?
EN

Stack Overflow用户
提问于 2014-06-07 00:32:08
回答 2查看 98关注 0票数 0

例如,在以下代码中。

代码语言:javascript
运行
复制
@interface TUTViewController : UIViewController
{
   NSTimer *timer;
} 
@end

代码语言:javascript
运行
复制
@interface TUTViewController : UIViewController

@property (weak, nonatomic) NSTimer *timer;

@end

在哪种情况下,我们使用第一种方法来声明变量?

EN

回答 2

Stack Overflow用户

发布于 2014-06-07 01:07:31

你会得到很多关于这一点的意见,通常是作为硬性的快速规则。

示例:

Maddy:永远不要把ivars放在.h里。ivars应该始终是私有的,这意味着它们不属于公共.h。如果创建ivar,请将它们放在.m文件中

我非常尊重麦迪,但在这一点上我不同意他。

如果将iVars放在.m文件中,则它们对其他类隐藏,但也对您创建的子类隐藏。

我更喜欢将我的实例变量标记为@protected,这使得它们可用于子类,但不能用于其他类。

其他人会告诉你要把所有东西都变成属性。在ARC之前,将所有对象保存在属性中是有意义的,因为您可以使用属性上的setter来管理对象上的内存。(为保留的属性赋值时,setter将首先释放所有旧值,然后保留新值。)现在,甚至对于iVars,ARC也会为你做这件事,所以让所有东西都成为属性的理由更少了。

我所做的就是让所有东西都变成iVar,除非:

  1. 我需要一个具有特殊行为的自定义getter或setter方法。
  2. 我想从另一个对象访问该值。
  3. 我需要将一个属性标记为“原子”,以便从另一个线程访问。(养成将所有属性声明为“非原子”的习惯。如果你不知道原子是用来做什么的,你会想要非原子的。原子属性比非原子属性慢。)

作为一个策略问题,除非通过一个属性,否则I从不访问另一个对象的iVars。

使用属性而不是实例变量会产生少量但实际的开销。读/写属性总是进行方法调用。iVar直接访问内存,而不需要调用方法。通常,差异太小而无关紧要。但是,如果您正在执行数百万个操作,例如对大图像中的每个像素执行某些操作,或者实时处理视频或音频样本的回调,则差异可能会很大。

票数 2
EN

Stack Overflow用户

发布于 2014-06-07 02:36:26

我强烈建议使用@properties,除非有很好的理由不这样做。诚然,这是一场宗教讨论,而不是技术讨论,但由于我们可能都是Mac狂热的追随者,如果苹果更喜欢你使用@properties,那就是标准。在我看来,苹果文档和Xcode都不像ReSharper在Visual Studio中那样推动标准(例如,当您不使用var时,它会发出警告)。这很遗憾,因为这会让我更容易在别人之后拿起代码。

有一种方法可以在.m文件中“隐藏”@属性,你应该这样声明它:

代码语言:javascript
运行
复制
@interface ABCMySpiffyClass ()

@property (weak, nonatomic) IBOutlet UIImageView *spiffyImage;
@property (weak, nonatomic) IBOutlet UILabel *spiffyTitle;

@end

这些并不是您的类的另一个使用者的完全私有的,但乍一看它是隐藏的。这应该会告诉其他开发人员,他或她不应该使用它们。我认为public/private更多地与文档有关,因为它与大多数应用程序的应用程序安全性有关。

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

https://stackoverflow.com/questions/24086700

复制
相关文章

相似问题

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