目标c – 在目标C中有私人成员的不同方法的比较

我来自C / Java世界,很明显如何创建私人会员.然而,我在目标C中看到了几种方法来做到这一点,而且我想听听这个问题

1)在.h文件中声明为@private

@interface MyClass : NSObject
{
    @private
    int someMember;  
}
@end

2)在.m文件的界面中声明它们

@interface MyClass() {
    int someMember;  
}
@end

@implementation MyClass
@end

3)在实施中声明它们

@implementation MyClass {
     int someMember;  
}
@end

什么是首选方法,为什么?我想念任何其他方法吗?

解决方法

我的偏好是#3:
// MyClass.m
...
@implementation MyClass {
     int someMember;
}
@end

它允许您干净地抽象和最小化依赖关系.

由于每个objc对象都是动态分配的,并且几乎没有物理依赖关系,所以您可以拥有最快的构建时间和最丰富的对象表示最小的编译开销(例如,最小的#imports和物理依赖).

抽象也是一个巨大的加法 – 私有是认的,你不应该偏离这个原因,也没有什么理由将内部公开给别人.这一切都非常好地保护,同时确保类型安全性不受影响. Big plus:您也可以轻松地在对象中声明C值,而不会让每个人都暴露于所有C库的依赖关系,而不是PIMPL,而不是全局范围内的结构,而不是一个* void **,而是一个适当的值.这是一个很好的编译防火墙.如果您曾在大型C或C项目上工作,您可能会高兴.

当然,宣布选项#2所示的ivars会带来所有这一切.所以这在很大程度上取决于你在哪里以及如何看待变量.一个ivar声明是具体的,而一个属性可能是抽象的 – 所以我喜欢将具体的混合和界面与接口进​​行分组; #2或#3是理想的,除非您需要向后兼容性.

如果你想要(伪)私有属性,我建议你在类继承中声明它们:

// MyClass.m
...
@interface MONClass ()
@property (nonatomic,copy) Nsstring * string;
@end

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...