2012-01-12 67 views
6

我在看斯坦福大学的iPad和iPhone应用程序开发课程视频。教师在视频中说,我们可以控制 - 将UI对象拖放到实现文件以创建一个动作。但是这样该方法不会在头文件中声明。这是否意味着可以在.m文件中实现方法而不是在.h文件中声明?我们不能在头文件中声明方法吗?

回答

6

取决于你如何定义 “OK” :-)

的Objective-C使用动态方法查找,并没有真正强制访问(“私人”,“公共”等)说明符。所以你不需要需要来在头文件中声明任何方法。

但是你最终会对编译器发起冲击,因为它确实执行了大量的类型检查,除非你说服它,否则你会失败。

5

您不需要在头文件中声明实现中的所有方法。但是,如果不在头文件中,显然你不能在另一个文件中通过字面名称引用它们,也不能在实现文件中“转发引用”它们。

(请注意,这是不是从普通的C不同,但是是在C类的方法++不同。)

+0

编译器的行为似乎在Xcode 4.5中有所变化。我有一堆我没有在.h中声明的方法,而且没有编译错误。但是,当我将此代码放入Xcode 4.2中以便检查与iOS 4.3的兼容性时,编译器会引发错误。 – JScarry 2012-12-13 19:56:14

+0

@JScarry - 我注意到类似的行为,尽管它似乎随某种编译器标志而变化。但Xcode 4。5在.m中推送'@ interface'的'()'版本,并且可以将所有内部声明粘贴在那里。 – 2012-12-13 19:59:05

5

它的“OK”不声明在标题是方法,在某些情况下。例如,如果使用ARC,那么编译器通常需要知道方法签名,以便它可以做正确的事情。但基本上所有的意思是,无论你使用哪种方法,它都必须知道你所调用的方法。

由于你在谈论Interface Builder,它有点不同,它会知道所有的方法,因为它可以“看到”你的头文件和实现文件的整个上下文,并知道方法的存在。即按照我上面的术语,该方法在使用之前已经被定义。

关于使用前限定,一般接受的方法是要么:

  1. 定义在接口文件(.h)中的方法。例如为:

    MyClass.h

    @interface MyClass : NSObject 
    - (void)someMethod; 
    @end 
    

    MyClass.m

    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
  2. 定义在一个类延续类别的方法。例如:

    MyClass.h

    @interface MyClass : NSObject 
    @end 
    

    MyClass.m

    @interface MyClass() 
    - (void)someMethod; 
    @end 
    
    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
相关问题