例如,在以下代码中。
@interface TUTViewController : UIViewController
{
NSTimer *timer;
}
@end
和
@interface TUTViewController : UIViewController
@property (weak, nonatomic) NSTimer *timer;
@end
我们在哪种情况下使用第一种方法来声明变量?
答案 0 :(得分:2)
你会对此有很多意见,通常被称为快速规则。
示例:
Maddy:永远不要把ivars放在.h。 ivars应该永远是私人的 意思是他们不属于公众.h。如果你创建了ivars,请放入 它们在.m文件中
我非常尊重Maddy,但我对此不以为然。
如果您将iVars放在.m文件中,它们会对其他类隐藏,但它们也会隐藏在您创建的子类中。
我更喜欢将我的实例变量标记为@protected,这使得它们可用于子类,但不能用于其他类。
其他人会告诉你把一切都归为财产。在ARC之前,将所有对象保存在属性中是有意义的,因为您可以使用属性上的setter来管理对象上的内存。 (当为保留属性赋值时,setter将首先释放任何旧值,然后保留新值。)现在ARC即使对于iVars也会为您处理,因此使所有属性成为属性的参数更少。 / p>
我所做的就是让一切都变成iVar,除非:
作为政策问题,我从不访问另一个对象的iVars,除了通过属性。
使用属性而不是实例变量有一个很小但实际的开销。属性读/写总是进行方法调用。 iVar直接访问内存而无需方法调用的开销。通常差异太小而不重要。但是,如果您正在进行数百万次操作,例如对大型图像中的每个像素执行某些操作,或者处理来自实时处理视频或音频样本的回调,则差异可能很大。
答案 1 :(得分:0)
我强烈建议使用@properties,除非有充分的理由不这样做。确实,讨论是宗教性的而不是技术性的,但由于我们可能都是Cult of Mac的追随者,如果Apple更喜欢使用@properties,那么这就是标准。在我看来,Apple文档和Xcode都不像ReSharper那样在Visual Studio中会做的很苛刻(例如,当你不使用var时它会发出警告)。很遗憾,因为这会让我更容易在其他人之后选择代码。
有一种方法可以隐藏"在.m文件中的@properties,您应该声明如下:
@interface ABCMySpiffyClass ()
@property (weak, nonatomic) IBOutlet UIImageView *spiffyImage;
@property (weak, nonatomic) IBOutlet UILabel *spiffyTitle;
@end
这些并非对您班级的其他消费者完全私密,但一见钟情就隐藏了。这应告诉其他开发者他或她不应该使用它们。我认为公共/私有更多地与文档有关,因为它与大多数应用程序的应用程序安全性有关。