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

时间:2009-05-15 05:00:47

标签: objective-c cocoa

背景:我是一个没有Objective-C / Cocoa经验的.NET人,但我正在研究Aaron Hillegass的书“Mac OS X的可可编程”,试图掌握基础知识。 (迄今为止的好书,BTW!)为了完成其中一个可选的侧面挑战,我正在编写一个基于文档的应用程序,允许用户在任意位置绘制椭圆。

我有两个类,接口如下:

@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?

但是,编译器警告我找不到方法,并且它们在运行时也不起作用。它们出现在Code Sense中,但我想这并不意味着什么(仍然习惯了XCode / VS之间的差异)我猜这里有一些Obj-C概念我不太理解这里,可能与myOvalView也是IBOutlet的事实,但我很遗憾。我应该做什么,更重要的是,为什么?


更新:我没有在OvalDrawDocument.m中声明OvalView.h。这样做修复了编译警告。但是,保存和加载似乎仍然无效,我无法弄清楚原因。

根据要求,我已在网上发布完整的源代码供我细读:BrowseDownload (59KB zip)

3 个答案:

答案 0 :(得分:5)

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

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

另外,正如Martin Pilkington在对你的问题的评论中所说,你可能应该用retain声明该属性,而不是assign

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我认为你必须展示更多的代码,因为你似乎有正确的东西,所以你必须在其他地方遗漏某些东西。此外,如果您要将椭圆声明为属性,那么在OvalDrawDocument中使用属性语法是有意义的:

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