4584


関数とメソッドの違いについて教えて頂きたいです。


CC BY-SA 3.0
2015-01-15T02:15:17.073
4580
2015-01-15T04:31:43.937
5967
question
objective-c
objective cの関数とメソッドの違い


どのレベルでの違いかが書かれていないので質問の意図とは違うかもしれませんが。。。

  * 関数：レシーバーはない
  * メソッド：レシーバーがある。定義するのはクラス内

という違いでいいのでしょうか。。。？


CC BY-SA 3.0
2015-01-15T03:17:54.543
4583
2015-01-15T03:17:54.543
845
4580
answer


**関数** は、後から呼び出し可能なコードのまとまりを指し、C の関数を引き継いだものです。

**メソッド**
は、オブジェクトに紐つけられている（属する）とするコードのまとまりを指し、コードが実行されるときにはそれが属するオブジェクトが明示されるものとされます。
Objective C の場合、メソッドは実際は「 **オブジェクトidとセレクタを引数に持った関数**
」としてあつかわれます。、例えば、メッセージ式で呼び出す場合は、対象オブジェクトにそのプロパティがないかそ探す、名前解決が行われます。

メソッドは以下のように定義されるIMP型 ( `IMPlementation` の略で、コードのまとまりのおかれるアドレス) です。
[`objc.h`](http://www.opensource.apple.com/source/objc4/objc4-646/runtime/objc.h)
から抜粋します。

[code]

    /// A pointer to an instance of a class.
    typedef struct objc_object *id;
    
    /// An opaque type that represents a method selector.
    typedef struct objc_selector *SEL;
    
    /// A pointer to the function of a method implementation. 
    typedef id (*IMP)(id, SEL, ...); 
    
[/code]

id, セレクタが何かが不明瞭ですが、その扱いはコンパイラによって決まるのでしょう。単純に、オブジェクトの管理番号,
メソッド名(文字列)ととらえてもよいでしょう。

※ _「オブジェクト」 は、クラスまたはインスタンスのこと_

参考: [Objective-C Runtime Programming Guide - Dynamic Method
Resolution](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html)


CC BY-SA 3.0
2015-01-15T03:18:25.680
4584
2015-01-15T04:31:43.937
2015-01-15T04:31:43.937
4978
4978
4580
answer