1

私はobjective-cに不慣れで、デリゲートの使用方法とかなり混乱しています。私はこのコードに出くわしました、そして私はそれを使っていくつかの疑問を明らかにしたいと思います。

#import <Foundation/Foundation.h>

@protocol ProcessDataDelegate <NSObject>

@required
- (void) processSuccessful: (BOOL)success;

@end

@interface ClassWithProtocol : NSObject 
{
  id <ProcessDataDelegate> delegate;
}

@property (retain) id delegate;

 -(void)startSomeProcess;

@end

ここで、「delegate」という単語への2つの参照があります。「idangledbracketdelegateangled-bracket-closed」とのコンテキストで使用した場合の意味を誰でも説明できますか?

ここでも、名前がデリゲートのプロパティがあります。それはどんな種類の衝突も引き起こしてはいけませんか?

前もって感謝します、

4

2 に答える 2

2

いいえ、プロパティは 1 つだけ@property (retain) id delegateです。もう1つは、オブジェクトcの意味でのプロパティではないプライベート変数です...NSObject次に、@synthetize.mファイルにキーワードがあり、プロパティを展開します。

もう 1 つの表記法id<protocol>は、デリゲートが特定のプロトコルに準拠することが期待されていることを示しています。

クラスからは両方にアクセスできますが、外部からはプロパティのみにアクセスできます。また、プロパティについては、その他のものが生成されます - 保持の場合 (ARC を使用していない場合)、メモリ管理ルーチン。

(混乱?)講義を完了するために、クラスのプライベート プロパティを保持する良い方法があります。匿名カテゴリの .h の代わりに .m ファイルで定義する場合です。

@interface MyClass()

@property (nonatomic, retain) NSString privateString;

@end

@implementation
@synthetize privateString;

// ...

@end
于 2012-07-31T23:28:34.893 に答える
2

この行:

id <ProcessDataDelegate> delegate;

と呼ばれるインスタンス変数があり、そのオブジェクトがプロトコルdelegateを採用している限り、好きなタイプのオブジェクトにすることができます。ProcessDataDelegate

後の @property で始まる行は、たまたまインスタンス変数と同じ名前を持つ、そのクラスの Objective-C 2.0 プロパティを宣言しているだけです。それは衝突ではありません。プロパティの宣言は、デリゲート インスタンス変数の getter/setter メソッドの単なるショートカットです。

より現代的な obj-c の使用法は次のようになります。

@interface ClassWithProtocol : NSObject

@property (retain) id<ProcessDataDelegate> delegate;

- (void)startSomeProcess;

@end

このことについては、Apple の Objective-C language documentationですべて読むことができます。

于 2012-07-31T23:35:41.823 に答える