2017-08-24 95 views
0

我在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 

我在头文件看起来从苹果的代表和编辑我的协议与@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

由于'UIImage'在'UIKit'中定义,并且您执行了导入:'#import '。但在此之前,'LPRPhotoCaptureCamera'尚未定义为“尚未”。 – Larme

+1

如果您使用前向声明'@class LPRPhotoCaptureCamera',则不再需要'#import“LPRPhotoCaptureCamera.h”'。 –

回答

0

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

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

换句话说,虽然LPRPhotoCaptureCameraDelegate.h进口LPRPhotoCaptureCamera.h,import不会实际导入LPRPhotoCaptureCamera,因为我们已经开始进口(和在中间)LPRPhotoCaptureCamera.h在较高的水平。

处理类型在循环中互相引用的常用方法是使用前向声明。 LPRPhotoCaptureCameraDelegate的声明只使用指向LPRPhotoCaptureCamera的指针,所以它实际上不需要声明LPRPhotoCaptureCamera类 - 它只需要知道它是一个类。像@class LPRPhotoCaptureCamera这样的前向声明将会这样做,这将允许您不再导入LPRPhotoCaptureCamera.hLPRPhotoCaptureCameraDelegate.h。类似地,如果LPRPhotoCaptureCamera的声明仅在变量的类型中使用LPRPhotoCaptureCameraDelegate,例如, id<LPRPhotoCaptureCameraDelegate> delegate,那么它实际上并不需要LPRPhotoCaptureCameraDelegate的声明 - 它只需要知道它是一个协议,所以像@protocol LPRPhotoCaptureCameraDelegate这样的前向声明就可以了,并且您不必在LPRPhotoCaptureCamera.h中导入LPRPhotoCaptureCameraDelegate.h。通常,只需要在A的头文件中导入B的头文件就是A实现B协议或从B类继承。

相关问题