在Apple的The Objective-C Programming Language: Defining a Class中,名为“Redefining self”的部分建议分配和返回实例的类方法仅使用'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'的多个方法”。我认为它与GCC 4.2有关,它使用Xcode默认设置。
当然,警告是正确的,因为NSView及其各种子类都实现了setAutoresizingMask,但它也是不必要的。因为它们只是警告,所以我忽略了它们,但是存在这样的风险:在三十个左右的不必要的警告中,有一个非常有用的警告隐藏在我看不到的地方。那么该怎么办?我确实希望遵循良好的编码实践,并且我想建立无警告的应用程序 - 我该如何做到?
答案 0 :(得分:3)
关于“找到多个方法”的警告意味着多个类实现setAutoresizingMask:
并且编译器无法分辨这是哪一个因为变量是id
类型的。编译器警告您可能(因为对象的类未知)可能会出错。尝试键入newInstance
作为NSScrollView*
或您的班级,警告就会消失。您仍然可以返回id
,因为它等同于所有对象指针类型。它只是你发送消息的变量,编译器想要静态输入。