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

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

有没有后果,优点,缺点? internal2的处理方式与internal3的不同之处在于程序员必须关心的吗? (当然,麦凯会说有所不同,但问题在于你是否在意练习)。

// 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/

两种方法之间的主要区别在于,您可以将类扩展包括在单独的头文件中,而@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的人需要知道关于。

就我个人而言,我更喜欢把我的ivars放在实现文件中的一个类扩展中,我认为它更清晰。 我不认为使用这个或那个是有任何性能上的优点或后果的,更多的是能够按照你想要的方式进行编码。