Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标-C“;“私人”;协议?_Objective C_Cocoa_Protocols - Fatal编程技术网

Objective c 目标-C“;“私人”;协议?

Objective c 目标-C“;“私人”;协议?,objective-c,cocoa,protocols,Objective C,Cocoa,Protocols,我得到了一个视图控制器类(MyViewController),它处理UIView子类(MyView)。我不想让视图控制器类以外的任何类知道UIView子类,因此我无法在MyViewController.h中导入MyView.h 因此,在MyViewController.m中,我将 #import "MyViewController.h" #import "MyView.h" @interface MyViewController (PrivateObjects) MyView *myView

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

因此,在
MyViewController.m
中,我将

#import "MyViewController.h"
#import "MyView.h"

@interface MyViewController (PrivateObjects)

MyView *myView;

@end

...
然而,为了从MyView获得反馈,我使用了一个委托。该代理必须实现
MyViewDelegate
协议

如何在
MyViewController
内部实现
MyViewDelegate
协议,而不必在
MyViewController.h
中导入
MyView.h

在MyView.h之外创建一个协议(.h),并在MyViewController的声明(.h)中使用该协议,例如:

#import "MyViewDelegate.h"
@interface MyViewController : UIViewController <MyViewDelegate>
#导入“MyViewDelegate.h”
@接口MyViewController:UIViewController

--Frank

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

@class MyView;

@interface MyViewController {
    MyView *myView;
}

@end

你为什么要使用协议?只需将这些方法放在PrivateObjects类别中


编辑:苹果公司将这种技术称为“

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

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

这是因为只要C指针在附近,你就不可能有真正的隐私,所以Objective-C的设计没有语法,只会给你一些错觉

例如,视图控制器的IB outlet变量通常只能由控制器本身访问,但它们始终是公共的,因为它们必须可以从取消归档和实例化nib文件并将outlet与相应实例链接的类中访问

[包括下面bbum的建议]

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

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

如果委托包含一个方法
-(void)myView:(myView*)myView textDidChange:(NSString*)text
,那该怎么办?这并不是说该语言在支持私有实现方面不够,非常重要的是,该语言的设计目的是不浪费语法来创造隐私的假象,这是基于C语言的所有功能。因为“只是将方法放在那里”是一种糟糕的编程风格,加上
MyView
应该是可重用的,因此委托在这里绝对有用。啊哈,看起来我误解了“我不想让视图控制器类以外的任何类知道UIView子类”