2010-03-26 64 views
1

在Apple的The Objective-C Programming Language: Defining a Class中,名为“重新定义自我”的部分建议该类方法分配和返回实例仅使用“self”分配实例,然后仅引用该实例。因此,我有一个号码的子类中,具有沿着线类方法:如何正确地重新定义自己,同时避免“多个方法命名...”警告?

+ (id)scrollViewWithFrame: (NSRect)rectFrame 
{ 
    id newInstance = [[[self alloc] initWithFrame:rectFrame] autorelease]; 
    [newInstance setHasHorizontalScroller: YES]; 
    [newInstance setHasVerticalScroller: YES]; 
    [newInstance setBorderType: NSNoBorder]; 
    [newInstance setAutoresizingMask: (NSViewWidthSizable 
       | NSViewHeightSizable)]; 

    return newInstance; 
} 

上面是,当然,一个NSScrollView的子类。不幸的是,在Xcode 3.x中,所有这些NSView子类现在都会引发警告:“警告:找到名为'-setAutoresizingMask'的多个方法”。我相信这与使用Xcode默认设置的GCC 4.2有关。

当然,警告是正确的,因为NSView及其各个子类都实现setAutoresizingMask,但它也是不必要的。由于它们只是警告,所以我忽略它们,但在三十个或多个不必要的警告之间存在着一个非常有用的警告,我根本看不到。那么该怎么办?我确实想要遵守良好的编码习惯,并且我想构建无警告的应用程序 - 我怎样才能做到这一点?

+1

你已经实现了setAutoresizingMask:使用与NSView.h中声明的不同的参数和/或返回类型。 – codewarrior 2010-03-26 23:09:22

+0

不是。这会引发'为...设置冲突类型'警告。 – 2010-03-27 08:28:15

回答

3

有关“找到多个方法”的警告意味着不止一个类实现了setAutoresizingMask:,并且编译器无法确定哪一个是因为变量被键入了id。编译器警告你可能(因为对象的类是未知的),你可能会得到错误的。尝试输入newInstance作为NSScrollView*或作为班级,警告将消失。您仍然可以返回id,因为它等价于所有对象指针类型。这只是您发送消息的变量,编译器希望进行静态类型化。

+1

很好的答案。我将它转换为子类,因为此方法将由子类及其下的所有子类实现。 – bobDevil 2010-03-26 17:01:15

+1

我也是,但是它在这个实现中并没有太大的区别,因为我们只调用了NSScrollView方法。 – Chuck 2010-03-26 17:09:37

+0

不幸的是,Chuck的答案为我提出了两个新问题: 1)为什么Apple在他们的文档中编写“id newInstance = [[self alloc] init]; // EXCELLENT”而不是“Rectangle * newInstance = [[self alloc]在里面];”。 2)为什么在Google代码上快速搜索“newInstance lang:objectivec”显示99%的结果支持“id newInstance”? 我没有知识来回答这些问题,但我对快速修复有点谨慎。 – 2010-03-26 17:10:35