在 Objective-C 中定义私有变量的最佳方法
Posted
技术标签:
【中文标题】在 Objective-C 中定义私有变量的最佳方法【英文标题】:Best way to define private variables in Objective-C 【发布时间】:2012-11-12 01:00:04 【问题描述】:我想在 MyClass.m 文件中定义私有实例变量。在我看来有两种方法可以做到:
使用类扩展
@interface HelloViewController ()
int value;
在@implementation 部分定义
@implementation HelloViewController
int value;
哪个更好?
我认为最近Apple的编码风格是使用类扩展?
例如MasterViewController.m 由 'Master-Detail Application Template' 生成
@interface MasterViewController ()
NSMutableArray *_objects;
@end
【问题讨论】:
为什么需要私有实例变量而不是私有属性? 当然是在@implementation - 少打字! How to declare instance variables and methods not visible or usable outside of the class instance?的可能重复 @PeterM 在实现中这样做意味着您不能将属性设置为读写/只读、原子/非原子和强/复制。看不出有多好。 【参考方案1】:@interface HelloViewController ()
@private //optional, this is old style
int vale;
但是,如果您正在创建一个库,理论上没有人会知道您没有在头文件中声明的任何方法。
复制自:How to make a real private instance variable?
在@implementation 中声明实例变量是最近的 Obj-C 的特性,这就是为什么你在 @interface - 没有其他选择。
如果您使用的编译器支持声明实例 实现中的变量声明它们可能是 最佳默认值 - 仅在需要时将它们放在界面中 被其他人访问。
在实现中声明的实例变量是隐式的 隐藏(实际上是私有的)并且无法更改可见性 - @public、@protected 和 @private 不会产生编译器错误(带有 至少当前的 Clang)但被忽略。
复制自:Private ivar in @interface or @implementation
【讨论】:
请在你的答案中添加一些推理。 谢谢。妥妥的投了赞成票。总结一下:这主要是个人喜好问题。【参考方案2】:“现代 Objective-C”的方法是在你的实现块中声明它们,如下所示:
@implementation ClassName
int privateInteger;
MyObject *privateObject;
// method implementations etc...
@end
更多详情请参阅我之前的this帖子。
【讨论】:
我在 Apple 文档中找不到任何建议这是更好的方法的地方。 在实现中做,缺点是不能指定非原子、副本等属性属性。 @Boon 这并不取决于你在哪里声明它,而是它是一个普通的 ivar 还是一个属性。 对不起,不清楚,是的,这就是我的意思。做 ivar 的缺点是你不能指定 strong/copy 等。所以你必须记住在数组上调用 copy。 99% 的 Apple 示例代码使用属性而不是 ivar。【参考方案3】:在我看来,最好的方法是将其定义为私有属性,您可以在实现中将其作为字段或属性访问,优点是您可以通过 self 以及 _fieldName 语法访问它们,这在某些情况下很方便.
@interface SignUpController ()
@property ViewHeaderView*header; //private properties/fields
@property UITextField*activeField;
@property CGFloat keyboardHeight;
@end
@implementation SignUpController
@end
【讨论】:
以上是关于在 Objective-C 中定义私有变量的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章