2012-02-03 28 views
5

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

是否有后果,优点,缺点或缺点? internal2的处理与程序员必须关心的内部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/

回答

9

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

  • MyClass.h:公共的ivars
  • MyClass的+ Private.h:半私人的ivars
  • MyClass.m:真的私人ivars

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

+2

类可以有多个实现块。它是类扩展的基础。 – 2012-02-03 01:46:26

+0

当然可以。但是不涉及类别,一个类只能有一个@implementation。 – UIAdam 2012-02-03 01:52:20

+1

@EllNeal:分类'@ implementation's!= Class'@ implementation's – 2012-02-03 01:56:33

3

就个人而言,我更喜欢把我的ivars在一个类扩展在实现文件中,我认为这是更清洁的方式。我认为使用其中一个或另一个不会带来任何性能优势或后果,更多的是能够按照自己的意愿编写代码。

相关问题