为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

墨色风雨 2019-07-11 13:18:52
为目标C中的类定义私有方法的最佳方法我刚开始编写Object-C,并且有Java背景,想知道写Objec-C程序是如何处理私有方法的。我理解可能有一些约定和习惯,并将这个问题看作是人们在目标C中使用的处理私有方法的最佳技术的聚合器。在发帖时,请为您的方法提供一个论据。为什么它是好的?它有哪些缺点(据你所知),以及你如何处理它们?至于我到目前为止的发现。可以使用类别[例如MyClass(私有)]在MyClass.m文件中定义为分组私有方法。这种方法有两个问题:Xcode(以及编译器?)不检查是否在相应的@Implementation块中定义私有类别中的所有方法您必须将声明私有类别的@接口放在MyClass.m文件的开头,否则Xcode会发出类似于“Self可能不会响应消息”PrivateFoo“之类的消息。第一个问题可以用空范畴[例如MyClass()]。第二个让我很困扰。我希望在文件末尾附近实现(并定义)私有方法;我不知道这是否可能。
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超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;@end

MONObject.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方法的数量。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 796 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信