Objective-C “private” protocols?
我有一个处理UIView子类(MyView)的视图控制器类(MyViewController)。我不想让除视图控制器类以外的任何类了解UIView子类,因此我无法在
因此,在
1 2 3 4 5 6 7 8 9 10 | #import"MyViewController.h" #import"MyView.h" @interface MyViewController (PrivateObjects) MyView *myView; @end ... |
但是,为了获得MyView的反馈,我使用了一个委托。该委托必须实现
如何在
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将此技术称为"非正式协议"