比较在Objective C中拥有私有成员的不同方法

Vic*_*nin 11 objective-c private-members

我来自C++/Java世界,很明显如何创建私有成员.但是,我在Objective C中看到了几种方法,我想听听cons和pros

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

@interface MyClass : NSObject
{
    @private
    int someMember;  
}
@end
Run Code Online (Sandbox Code Playgroud)

2)在.m文件中的接口中声明它们

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

@implementation MyClass
@end
Run Code Online (Sandbox Code Playgroud)

3)在实施中声明它们

@implementation MyClass {
     int someMember;  
}
@end 
Run Code Online (Sandbox Code Playgroud)

什么是首选方法,为什么?我错过了其他方法吗?

jus*_*tin 8

我的偏好是#3:

// MyClass.m
...
@implementation MyClass {
     int someMember;
}
@end
Run Code Online (Sandbox Code Playgroud)

它允许您干净利落地抽象并最小化依赖性.

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

抽象也是一个巨大的优势 - 私有是默认的,你没有理由偏离它,没有理由将内部暴露给其他人.这样可以非常好地隐藏它,同时确保类型安全不会受到影响.大加:您还可以轻松地在对象中声明C++值,而不会将所有人暴露给所有C++库的依赖关系 - 不是PIMPL,不是全局范围内的结构,不是*void**,而是适当的.这是一个很棒的编译防火墙.如果您从事大型C或C++项目,您可能会感到高兴.

当然,如选项#2中所示,声明ivars会带来所有这些.因此,它几乎取决于您希望在何处以及如何看待变量.一个ivar声明是具体的,而一个属性可能是抽象的 - 所以我赞成将具体的具体化和接口分组,但无论如何; 除非您需要向后兼容,否则#2或#3是理想选择.

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

// MyClass.m
...
@interface MONClass ()
@property (nonatomic, copy) NSString * string;
@end
Run Code Online (Sandbox Code Playgroud)