[解決済み] Objective-Cのプロトコルでプロパティを含むものはどう扱えばいいのか?
質問
Objective-Cのプロトコルは、次のような使われ方をしているのを見たことがあります。
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
サブクラスが拡張する具体的なスーパークラスを書く代わりに、この形式が使われているのを見たことがあります。問題は、このプロトコルに準拠する場合、プロパティを自分で合成する必要があるのかどうかです。スーパークラスを拡張しているのであれば、答えは明らかに「いいえ」です。しかし、プロトコルが準拠を要求するプロパティをどのように扱うのでしょうか?
私の理解では、これらのプロパティを必要とするプロトコルに準拠するオブジェクトのヘッダーファイルで、やはりインスタンス変数を宣言する必要があります。その場合、それらは単なる指針に過ぎないと考えていいのでしょうか?ほとんど同じことが、必須メソッドの場合にも当てはまらない。プロトコルに記載されている必須メソッドを除外すると、コンパイラに手首を叩かれます。しかし、プロパティの裏側はどうなっているのでしょうか?
以下はコンパイルエラーを発生させる例です(注:手元の問題に反映されないコードを切り捨てました)。
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
どのように解決するのですか?
プロトコルは、プロトコルを介してあなたのクラスを知っている人全てに、プロパティ
anObject
が存在することを伝えているだけです。 プロトコルは本物ではなく、それ自身は変数やメソッドを持ちません。プロトコルは、あなたのクラスについて真である属性の特定のセットを記述するだけなので、それへの参照を持つオブジェクトは特定の方法でそれらを使用することができます。
つまり、プロトコルに準拠したクラスでは、anObjectが動作するようにあらゆることをしなければならないのです。
@property
と
@synthesize
は、要するにコードを生成してくれる二つの機構です。
@property
は、そのプロパティ名に対するゲッター(および/またはセッター)メソッドが存在することを示すだけです。 最近では
@property
だけで、システムによって作成されたメソッドとストレージ変数を持つことができるようになりました (以前は、このプロパティに
@sythesize
). しかし、変数にアクセスし、保存するための何かを持っていなければなりません。
関連
-
[解決済み] hw.machine」識別子の信頼性を確認する方法は?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] Objective-Cで、オブジェクトの種類をテストするにはどうしたらいいですか?
-
[解決済み] UITextViewのキーボードをリターンキーで解除するには?
-
[解決済み] UIViewの下に影を描くには?
-
[解決済み] .xibファイルと.storyboardの違いは何ですか?
-
[解決済み] iPhone/iPadのディスクの空き容量を確認する方法を教えてください。
-
[解決済み] iPhoneのデータ使用量のトラッキング/モニタリング
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Mobile Safariで電話番号のリンクを無効にする方法を教えてください。
-
[解決済み] iOSの配布証明書の正しい更新方法
-
[解決済み] CGFloatとfloatを使うことの違いは何ですか?
-
[解決済み] iPhoneでウェブページからアプリがインストールされているかどうかを確認する方法
-
[解決済み] TabBarのタブビューにプログラムで切り替える?
-
[解決済み] 再署名 IPA (iPhone)
-
[解決済み] position: iPadとiPhoneで固定が効かない。
-
[解決済み] Objective-Cのプロトコルでプロパティを含むものはどう扱えばいいのか?
-
[解決済み] UILabelがラベルサイズに合うようにテキストを自動縮小しない
-
[解決済み] ObjectiveCの変数位置の宣言・定義?