在类扩展或@implementation块中添加伪私有ivars有什么区别?

时间:2012-02-03 01:07:44

标签: objective-c ios

将伪私有实例变量放在.m文件中的类扩展中,或者将它们放在新引入的@implementation括号中有什么区别?如下所示?

是否存在后果,优点,缺点?内部2是否以程序员必须关注的方式与内部3不同? (当然,麦凯会说会有所不同,但问题是你是否在实践中关心)。

// MyClass.m

@interface MyClass () {
    id internal2;
}
@end


@implementation MyClass {
    id internal3;
}

- (void)internalMethod {
    NSLog(@"%@ %@", internal2, internal3);
}

@end

来源:http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/

2 个答案:

答案 0 :(得分:9)

这两种方法的主要区别在于你可以在一个单独的头文件中包含类扩展,而@implementation ivars显然必须与.m文件中的@implementation块一起使用(并且只能有一个@给定类的实现(不包括扩展))。实际结果是你可以有多个级别的“私人”ivars:

  • MyClass.h:public ivars
  • MyClass + Private.h:半私人ivars
  • MyClass.m:非常私人的ivars

作为一个假设的例子,假装MyClass是UIView。在这种情况下,UIView.h是我们都可以访问的标题,UIView + Private.h是只有Apple可以访问的“私有”标题,而UIView.m只有那些专门负责UIView的人需要知道的东西关于。

答案 1 :(得分:3)

就个人而言,我更喜欢将我的ivars放在实现文件中的单个类扩展中,我认为它更干净。我不认为使用其中一个有任何性能优势或后果,更多的是能够以您想要的方式编码。