代码之家  ›  专栏  ›  技术社区  ›  winsmith

Objective-C类中的关系

  •  0
  • winsmith  · 技术社区  · 17 年前

    我真的很犹豫问这个问题,因为肯定会有一个非常简单的答案,但我就是想不出来。下面是:

    我在一个名为 Copier.h :

    #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
    

    CopyQueue *queue; 我做错了什么?

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

    3 回复  |  直到 17 年前
        1
  •  1
  •   David McGraw    17 年前

    尝试

    @class CopyQueue  
    
    @interface {
         ...
    }
    
    ...
    
    @end
    
        2
  •  1
  •   Lyndsey Ferguson    17 年前

    预删除CopyQueue应该是不必要的(David McGraw发布的“@class CopyQueue”),因为海报已经写了行“#import“CopyQueue.h”;”。也许导入“CopyQueue”后不必要的“;”会导致问题?

        3
  •  0
  •   Barry Wark    17 年前

    这根本不是一个愚蠢的问题。它反映了使用静态类型的编译语言,如C(和Objective-C,即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是一个类(使用 @类复制队列 ).

    这个 @类复制队列 声明是告诉编译器它可以处理 CopyQueue* 作为指向Objective-C类(类型id)的指针,您将通过 @interface 稍后(例如在单独的模块中)。