包含头文件的问题

时间:2016-03-30 08:31:42

标签: ios xcode nsoperation

在我的应用程序中,我有几个类,每个类交叉  其他。我需要连接这些类并创建它们的属性,但是有些类对另一个类是不可见的,我想这里的主要问题是包含头文件。请问您的建议是什么问题? class MyOperationQueue

#import <Foundation/Foundation.h>
#import "ContentTableView.h"
//#import "CustomTableViewCell.h"
//#import "ObjectForTableCell.h"

@interface MyOperationQueue : NSOperation

@property(assign, nonatomic) BOOL isCancelled;
@property(strong, nonatomic) ContentTableView* tableView; //unknown type name

class ObjectForTableCell

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

@interface ObjectForTableCell : NSObject

@property (strong, nonatomic) MyOperationQueue* currentQueue;//unknown type name

class ContentTableView - 这里我没有警告

#import <UIKit/UIKit.h>
#import "CustomTableViewCell.h"
#import "Protocol.h"
#import "MyOperationQueue.h"
#import "ObjectForTableCell.h"
#import "ImageViewController.h"

@interface ContentTableView : UITableViewController<CellDelegate, NSURLSessionDataDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate>

谢谢我提前寻求帮助。

2 个答案:

答案 0 :(得分:5)

坚持@class MyOperationQueue;以上

@interface ObjectForTableCell : NSObject

制作它:

@class MyOperationQueue;

@interface ObjectForTableCell : NSObject

以下摘自官方文档here

  

参考其他课程

     

接口文件声明一个类,并通过导入其超类,   隐式包含所有继承类的声明   NSObject通过它的超类。如果界面提到   不在此层次结构中的类,它必须显式或导入它们   用@class指令声明它们:

@class Rectangle, Circle;
     

该指令只是通知了   “Rectangle”和“Circle”是类名的编译器。它没有   导入他们的接口文件。接口文件提到了类名   当它静态地键入实例变量,返回值和   参数。例如,此声明提到了NSColor类。

     

因为像这样的声明只是使用类名作为类型和   不依赖于类接口的任何细节(其方法和   实例变量),@ class指令给编译器   充分预警会发生什么。但是,界面在哪里   实际使用的是一个类(实例创建,消息发送),   必须导入类接口。通常,接口文件使用   @class声明类,以及相应的实现文件   导入他们的接口(因为它需要创建的实例)   那些课程或发送消息)。

     

@class指令最小化编译器看到的代码量   和链接器,因此是提供前进的最简单方法   声明一个类名。简单,它避免了潜力   导入仍导入其他文件的文件可能带来的问题   文件。例如,如果一个类声明了静态类型的实例   另一个类的变量,以及它们的两个接口文件   另外,这两个类都没有正确编译。

还有一篇关于各种其他编译器指令here的优秀文章(由NSHipster提供)。我建议阅读它,因为这些知识将来可能会很好。

答案 1 :(得分:1)

有时在创建循环导入时会出现问题,即 MyOperationQueue.h ContentTableView.h 相互导入。

一个常见的解决方法是删除其中至少一个导入,并使用类的前向声明替换它们,即将@class ContentTableView;添加到 MyOperationQueue.h

然后,您应该在实现文件 MyOperationQueue.m 中导入ContentTableView.h,以便知道整个界面。这通常也有助于减少编译时间。