关于可可:Objective-C”私有”协议?

 2021-04-26 

Objective-C “private” protocols?

我有一个处理UIView子类(MyView)的视图控制器类(MyViewController)。我不想让除视图控制器类以外的任何类了解UIView子类,因此我无法在MyViewController.h中导入MyView.h

因此,在MyViewController.m中,我放了

1
2
3
4
5
6
7
8
9
10
#import"MyViewController.h"
#import"MyView.h"

@interface MyViewController (PrivateObjects)

MyView *myView;

@end

...

但是,为了获得MyView的反馈,我使用了一个委托。该委托必须实现MyViewDelegate协议。

如何在MyViewController内部实现MyViewDelegate协议而不必在MyViewController.h中使用#import MyView.h


1
2
@interface MyViewController (PrivateObjects) <MyViewDelegate>
....

(顺便说一句,您不能在类别中声明新的ivar。)


您可以在MyViewController.h中使用forware声明。

1
2
3
4
5
6
7
@class MyView;

@interface MyViewController {
    MyView *myView;
}

@end

我知道这听起来很奇怪,但是根据经验,我可以告诉您不要太在意可可中的隐私层次结构。

因此,在应用程序或内部框架中,只需记录说明应如何使用的类即可。

那是因为当C指针很长时,您就没有真正的隐私,因此Objective-C的设计没有一种语法,只会给您带来一些错觉。

例如,视图控制器的IB出口变量通常仅应由控制器本身访问,但它们始终是公共的,因为必须从取消存档和实例化nib文件并将出口与对应的链接的类中访问它们实例。

[包括下面来自bbum的建议]


在MyView.h之外创建协议(.h),并将其用于MyViewController的声明(.h)中,例如:

1
2
#import"MyViewDelegate.h"
@interface MyViewController : UIViewController <MyViewDelegate>

-弗兰克


您为什么还要使用协议?只需将这些方法放在您的PrivateObjects类别中即可。

编辑:Apple将此技术称为"非正式协议"