代码之家  ›  专栏  ›  技术社区  ›  Brant Bobby

基本的Obj-C问题:对对象调用方法

  •  1
  • Brant Bobby  · 技术社区  · 15 年前

    背景:我是一个.NET用户,以前没有Objective-C/Cocoa方面的经验,但我正在阅读亚伦·希尔莱加斯的书《Mac OS X的Cocoa编程》,试图了解一些基本知识。(顺便说一句,到目前为止这本书很棒!)为了完成一个可选的侧面挑战,我正在编写一个基于文档的应用程序,允许用户在任意位置绘制椭圆。

    @interface OvalDrawDocument : NSDocument
    {
        IBOutlet OvalView* myOvalView;
    }
    @end
    
    @interface OvalView : NSView {
        NSMutableArray *ovals;
    }
    @property (readwrite, assign) NSMutableArray *ovals;
    @end
    

    在实施 OvalDrawDocument 我正在尝试使用自动生成的属性访问器 ovals 就像这样:

    // in OvalView.m
    @synthesize ovals;
    
    // in OvalDrawDocument.m
    [myOvalView setOvals:loadedOvals];                // setter?
    NSMutableArray *ovalsToSave = [myOvalView ovals]; // getter?
    

    但是,编译器警告我,这些方法找不到,并且它们在运行时也不工作。它们出现在代码的意义上,但我想这并不意味着什么(仍然习惯于这里XCode/VS之间的差异),我猜这里有些Obj-C的概念我还没有完全理解,可能与以下事实有关 myOvalView IBOutlet ,但我迷路了。我该怎么办, 更重要的是,为什么?


    更新

    根据要求,我已将完整的源代码发布到网上供阅读: Browse Download (59KB zip) .

    3 回复  |  直到 12 年前
        1
  •  5
  •   Peter Hosey    15 年前

    警告:在OvalDrawDocumentation实现文件中导入OvalView的头。

    运行时不起作用的消息:确保您已经在IB中实际连接了插座。

    而且,正如马丁·皮尔金顿在他对你的问题的评论中所说,你可能应该用 retain ,不是 assign

        2
  •  1
  •   tmadsen    15 年前

    它与IBOutlet keywrod无关,IBOutlet keywrod只是Interface Builder的一个“helper”关键字,在编译时被定义为“nothing”。您确实导入了相关的头文件并在myOvalView上执行了alloc/init?

        3
  •  0
  •   Mark Bessey    15 年前

    // in OvalDrawDocument.m
    myOvalView.ovals = loadedOvals;                // setter
    NSMutableArray *ovalsToSave = myOvalView.ovals; // getter