Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2009-05-06

iPhoneアプリ開発における 非形式プロトコル (informal protocol) の利用について

03:43 | はてなブックマーク - iPhoneアプリ開発における 非形式プロトコル (informal protocol) の利用について - iPhoneアプリ開発まっしぐら★

iPhoneアプリ開発で Objective-Cコーディングをする際にたいへん有用な資料として、

が挙げられますが、両者とも Objective-C 2.0 採用前に書かれた内容であるため一部注意が必要な箇所がありそうです。

例えば、非形式プロトコルについて、

Apple の Coding Guidelines for Cocoa では】

Primarily because of this reason, you don’t use formal protocols to declare delegation methods. Another reason delegation methods are declared as (unimplemented) categories on NSObject—that is, informal protocols—is because implementing each of them is optional.

※意訳:デリゲーションメソッドの幾つかをoptional(実装しなくても良いよう)にするんだったら NSObject のカテゴリ、つまり非形式プロトコルを使いたまえ。

【Dynamic Objective-C では】

このように調べてみると、デリゲートのような仕組みには、非形式プロトコルの方が便利だと言えるだろう。

と記載されています。

これだけしか見ていない段階では、

「デリゲーションメソッドとか作るときは @protocol のほうじゃなくて @inteface NSObject(XXX) とかカテゴリを使うのか」

と一瞬勘違いしてしまいましたが、ちょっと違和感を感じてAppleが公開している「The Objective-C 2.0 Programming Language」を見直してみると、

An informal protocol may be useful when all the methods are optional, such as for a delegate, but (on Mac OS X v10.5 and later) it is typically better to use a formal protocol with optional methods.

※意訳:「実装しなくてもいいメソッドがある場合は非形式プロトコルが便利だよ。例えばデリゲートとかね。ただし Mac OS X v10.5 以降 では形式プロトコルで @optional(実装が任意のメソッドの定義)が使えるようになったのでそちらを使うことを推奨するよん♪」

と明記されてました。

まー、非形式プロトコルも現状のSDKの中ではガンガン使われているものですし使ってもまったく問題ないでしょうが、たかだか自分のクラス用のデリゲートのためにNSObjectを拡張してしまうのもナンセンスといえばナンセンスですもんね。

この話は Mac OS X v10.5 のサブセットである iPhone OS におけるアプリ開発でもちろん適用されますので、せっかく言語的に追加された @protocol + @optional を積極的に使っていこうと思った次第です。