在我的应用程序中,我有几个类,每个类交叉 其他。我需要连接这些类并创建它们的属性,但是有些类对另一个类是不可见的,我想这里的主要问题是包含头文件。请问您的建议是什么问题? 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>
谢谢我提前寻求帮助。
答案 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,以便知道整个界面。这通常也有助于减少编译时间。