【问题标题】:Relationships in Objective-C classesObjective-C 类中的关系
【发布时间】:2009-02-27 10:33:55
【问题描述】:

我真的很犹豫要不要问这个问题,因为它肯定有一个非常简单的答案,但我就是想不通。如下:

我在一个名为 Copier.h 的文件中有这个 Objective-C 代码:

#import <Cocoa/Cocoa.h>
#import "CopyQueue.h";


@interface Copier : NSObject {
    IBOutlet NSTextField *statusField;
    IBOutlet NSTextField *toField;
    CopyQueue *queue;
}
- (IBAction)startCopy:(id)sender;
- (void)dropFile:(NSString *)theFileName;
@end

每当我尝试在 Xcode 中编译我的项目时,都会在显示 CopyQueue *queue; 的行中出现语法错误,我做错了什么?

当我将行更改为id *queue; 时文件编译,但这不是解决方案,对吗?用泛型引用替换所有类型引用?

【问题讨论】:

  • 你确定包含CopyQueue的定义了吗?

标签: objective-c


【解决方案1】:

试试……

@class CopyQueue  

@interface {
     ...
}

...

@end

【讨论】:

  • 太棒了!你是最棒的 :) 不知道我怎么会错过。
【解决方案2】:

不需要预先声明 CopyQueue(David McGraw 发布的“@class CopyQueue”),因为发帖人已经写了“#import "CopyQueue.h";”这一行。也许是不必要的“;”在 "#import "CopyQueue" 之后出现问题?

无论如何,请确保在 CopyQueue.h 文件中正确声明了 CopyQueue(具有相同的拼写和大小写)。

【讨论】:

  • CopyQueue.h 据我所知是正确的。但是,在#import "CopyQueue.h" 之后删除分号不会改变任何内容。 CopyQueue.h 是否必须包含 @class CopyQueue 语句?
【解决方案3】:

这根本不是一个愚蠢的问题。它反映了使用静态类型的编译语言(如 C)(以及作为 C 超集的 Objective-C)的更复杂的方面之一。对于来自动态类型语言(如 Python、Ruby、PHP 等)的人来说,这可能会有些颠簸。

在使用类型(在 C、Objective-C 或 C++ 中)之前,您必须声明该类型。 CopyQueue 是一种类型,因此必须声明(使用@interface CopyQueue : SomeClass {} @end 或使用@class CopyQueue 隐式声明。在您发布的示例中,Cocoa 程序员会假设 CopyQueue.h 包含类似这样的内容

@interface CopyQueue : SuperClass { //where SuperClass is the name of the class that CopyQueue inherits from

  ...
  }
...
@end

如果不是这种情况(您对 Lyndsey Ferguson 的评论表明不是),您必须包含定义 CopyQueue 类类型的头文件(如上),或者告诉编译器 CopyQueue 是一个类(使用@class CopyQueue)。

@class CopyQueue 声明是一种告诉编译器它可以将 CopyQueue* 视为指向 Objective-C 类(类型 id)的指针并且您将填写详细信息(例如 CopyQueue 的实例变量和方法)通过@interface 稍后(例如在单独的模块中)。

【讨论】:

  • 查看bitbucket.org/winsmith/copymeister/src 的源代码。 CopyQueue 的定义包含在文件中,但我仍然需要 @class-line 使其工作。 (顺便说一句,这对我来说没问题)
  • 您有一个循环引用:Copier.h 导入 CopyQueue.h,后者导入 Copier.h。在这种情况下,您是正确的:您需要使用前向 @class 声明。您可以使用@class CopyQueue 行从标题中删除#import CopyQueue.h。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多