2012-01-12 69 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 
    
相關問題