预期的协议类型

时间:2017-08-24 08:48:10

标签: ios objective-c protocols

我在objective-c中实现了一个协议,当我使用自己的类作为类型定义时,xCode告诉我需要一个类型。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#import "LPRPhotoCaptureCamera.h"

@protocol LPRPhotoCaptureCameraDelegate <NSObject>

- (void)camera:(LPRPhotoCaptureCamera *)camera finishedCapturingPhoto:(UIImage *)capturedUIImage;

@end

我查看了Apples Delegates的头文件,并使用@class LPRPhotoCaptureCamera编辑了我的协议,它可以正常工作。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#import "LPRPhotoCaptureCamera.h"

@class LPRPhotoCaptureCamera;
@protocol LPRPhotoCaptureCameraDelegate <NSObject>

- (void)camera:(LPRPhotoCaptureCamera *)camera finishedCapturingPhoto:(UIImage *)capturedUIImage;

@end

我想知道为什么xCode在这里没有为UIImage抛出错误,你有解释吗?

1 个答案:

答案 0 :(得分:0)

可能发生的事情(我猜是因为你没有向我们展示文件)是LPRPhotoCaptureCamera.h导入文件顶部的LPRPhotoCaptureCameraDelegate.h。那么你有一个导入周期。

例如,在编译LPRPhotoCaptureCamera.m时,它将导入LPRPhotoCaptureCamera.h,它会在文件顶部导入LPRPhotoCaptureCameraDelegate.h(在LPRPhotoCaptureCamera类声明之前) 。 LPRPhotoCaptureCameraDelegate.h然后导入LPRPhotoCaptureCamera.h,但#import保证文件只导入一次,因此导入不导入任何内容。因此,当它进入LPRPhotoCaptureCameraDelegate协议的声明时,它引用了LPRPhotoCaptureCamera *类型,它不理解,因为尚未声明LPRPhotoCaptureCamera

换句话说,虽然LPRPhotoCaptureCameraDelegate.h导入LPRPhotoCaptureCamera.h,但该导入实际上并未导入LPRPhotoCaptureCamera,因为我们已经开始导入(并且位于中间){{1}在更高的层次上。

处理类型在循环中相互引用时的常用方法是使用前向声明。 LPRPhotoCaptureCamera.h的声明仅使用指向LPRPhotoCaptureCameraDelegate的指针,因此它实际上不需要LPRPhotoCaptureCamera类的声明 - 它只需要知道它是一个类。像[{1}}这样的转发声明可以执行此操作,这样您就无法再在LPRPhotoCaptureCamera中导入@class LPRPhotoCaptureCamera了。同样,如果LPRPhotoCaptureCamera.h的声明仅在变量类型中使用LPRPhotoCaptureCameraDelegate.h,例如LPRPhotoCaptureCamera,然后它实际上不需要LPRPhotoCaptureCameraDelegate的声明 - 它只需要知道它是一个协议,所以像id<LPRPhotoCaptureCameraDelegate> delegate这样的前瞻声明会做,而你不要必须在LPRPhotoCaptureCameraDelegate中导入@protocol LPRPhotoCaptureCameraDelegate。通常,只有当A实现B协议或从B类继承时,才需要在A的头中导入B的头。