Objective-C中的私有方法,在Xcode 4.3中我不再需要在我的实现文件中声明它们吗?

tes*_*est 15 xcode declaration objective-c forward forward-declaration

我头上有很多问号.我没有得到的是在xcode 4.3之前我需要在我的实现文件中声明前向声明(对于私有方法).

就像我的.m文件一样:

// deleting this with xcode 4.3 the below code still does work 
// in previous versions i had to put this because otherwise the compiler can't find methodFirst
@interface DetailViewController ()
- (void)methodFirst;
- (void)methodSecond;
@end


@implementation DetailViewController

- (void) methodSecond
{
   // if i delete the forward declaration now adays i dont get a compiler error that he cant find method first
   [self methodFirst];
}

- (void) methodFirst
{
}

@end
Run Code Online (Sandbox Code Playgroud)

现在看来我不再需要那样做了?Apple是否更新了编译器以便不再需要提交声明?

我找不到任何有关此更改的Apple官方消息来源的参考.我想知道其他人在新环境中遇到了什么.

BJ *_*mer 34

从Xcode 4.3附带的LLVM编译器版本开始,如果您尝试调用编译器之前未见过的方法,它将查看当前@implementation块的其余部分以查看该方法是否稍后声明.如果是这样,那么它会使用它,并且您不会收到警告.因此,从Xcode 4.3开始,预先声明内部方法的需求就少得多.显然,您仍然需要声明公开暴露给其他类的方法.

在一些Xcode 4.3测试版的发行说明中注意到了这一变化,但显然没有进入"Xcode 4.3中的新功能"最终文档.

与其他答案中建议的不同,这不仅仅是默认情况下已关闭的"未声明的选择器"警告.事实上,如果您使用ARC,则无法识别的选择器仍然是硬错误.试着打电话[self myNonexistentMethod],你会看到; 编译器仍抱怨.


小智 5

Objective-C中没有任何私有方法.您正在考虑的是类继续,您可以在.m文件中声明的"无名"类别接口,以声明将在类实现中但不在公共接口中的方法.

从来没有要求在使用之前声明方法.但是,它总是一个好主意,并且编译器有一个警告标志,指示何时使用尚未看到的方法.原因是操作系统的函数调用约定.结构,浮点数,整数和指针等不同类型,当它们是函数的参数或从函数返回值时,都可以以不同的方式处理.事实上,在不同的计算机和不同的操作系统,它们以不同的方式处理.要知道如何处理Objective-C方法的参数和返回值,编译器需要知道该方法的签名:所需类型的参数数量以及返回的类型.

如果没有看到该方法的声明,那么编译器将需要进行猜测.如果猜测不正确,那么它最终可能会将错误的值放入参数中,或者错误地解释返回值,或尝试从不存在的堆栈中取出某些内容.

  • 错误.这不仅仅是编译器警告被关闭.从Xcode 4.3中的LLVM版本开始,编译器可以查看所有当前文件以查找方法声明.它不一定需要在文件中更早地声明. (4认同)