猿问

为目标C中的类定义私有方法的最佳方法

为目标C中的类定义私有方法的最佳方法

我刚开始编写Object-C,并且有Java背景,想知道写Objec-C程序是如何处理私有方法的。

我理解可能有一些约定和习惯,并将这个问题看作是人们在目标C中使用的处理私有方法的最佳技术的聚合器。

在发帖时,请为您的方法提供一个论据。为什么它是好的?它有哪些缺点(据你所知),以及你如何处理它们?


至于我到目前为止的发现。

可以使用类别[例如MyClass(私有)]在MyClass.m文件中定义为分组私有方法。

这种方法有两个问题:

  1. Xcode(以及编译器?)不检查是否在相应的@Implementation块中定义私有类别中的所有方法
  2. 您必须将声明私有类别的@接口放在MyClass.m文件的开头,否则Xcode会发出类似于“Self可能不会响应消息”PrivateFoo“之类的消息。

第一个问题可以用空范畴[例如MyClass()]。
第二个让我很困扰。我希望在文件末尾附近实现(并定义)私有方法;我不知道这是否可能。


墨色风雨
浏览 798回答 3
3回答

智慧大石

中定义私有方法。@implementation块在大多数情况下都是理想的。clang会在@implementation不管申报顺序如何。没有必要在类延续(也称为类扩展)或命名类别中声明它们。在某些情况下,需要在类延续中声明方法(例如,如果使用类延续和@implementation).static对于特别敏感或速度重要的私有方法,功能非常好。命名前缀的约定可以帮助您避免意外地重写私有方法(我发现类名是前缀安全的)。命名类别(如:@interface MONObject (PrivateStuff))并不是一个特别好的主意,因为加载时可能会出现命名冲突。它们实际上只对朋友或受保护的方法有用(这些方法很少是一个很好的选择)。为了确保对不完整的类别实现发出警告,您应该实际实现它:@implementation MONObject (PrivateStuff)...HERE...@end下面是一个带注释的小备忘单:MONObject.h@interface MONObject : NSObject// public declaration required for clients' visibility/use.@property (nonatomic, assign, readwrite) bool  publicBool;// public declaration required for clients' visibility/use.- (void)publicMethod;@endMONObject.m@interface MONObject ()@property (nonatomic, assign, readwrite) bool privateBool; // you can use a convention where the class name prefix is reserved// for private methods this can reduce accidental overriding: - (void)MONObject_privateMethod;@end// The potentially good thing about functions is that they are truly // inaccessible; They may not be overridden, accidentally used,// looked up via the objc runtime, and will often be eliminated from / backtraces. Unlike methods, they can also be inlined. If unused// (e.g. diagnostic omitted in release) or every use is inlined, // they may be removed from the binary:static void PrivateMethod(MONObject * pObject) {     pObject.privateBool = true;}@implementation MONObject{     bool anIvar;}static void AnotherPrivateMethod(MONObject * pObject) {     if (0 == pObject) {         assert(0 && "invalid parameter");         return;     }     // if declared in the @implementation scope, you *could* access the     // private ivars directly (although you should rarely do this):     pObject->anIvar = true;}- (void)publicMethod{     // declared below -- but clang can see its declaration in this     // translation:     [self privateMethod];}// no declaration required.- (void)privateMethod{}- (void)MONObject_privateMethod{}@end另一种可能不是很明显的方法:C+类型既可以非常快,又可以提供更高程度的控制,同时最小化导出和加载的objc方法的数量。
随时随地看视频慕课网APP
我要回答