我在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抛出错误,你有解释吗?
答案 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的头。