4

フォームシートスタイルで表示されるモーダルビューコントローラがあります。デリゲートプロトコルがあります。私はそのプロトコルを実装し、プレゼンテーションの前に代理人を割り当てていますが、プロパティが強力であるにもかかわらず、そのプロトコルは失われています。考えられる原因は大歓迎です。ありがとう!

これがプロパティ宣言です。

@protocol SDStoreViewDelegate <NSObject>
// Methods
@end

@interface SDStoreViewController : UIViewController

@property (strong, nonatomic) id <SDStoreViewDelegate> delegate;

@end

これは、オブジェクトが作成され、デリゲートが設定される場所です。

SDStoreViewController *store = [[SDStoreViewController alloc] init];
[store setDelegate:self];

NSLog(@"1 %@",store.delegate); // Returns Object as expected

[self presentViewController:store animated:YES completion:^{
    NSLog(@"3 %@",store.delegate); // Returns Object as expected
}];

NSLog(@"4 %@",store.delegate); // Returns Object as expected

これは、SDStoreViewControllerのviewDidLoadです。すでに代理人を失いました

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"3 %@",_delegate); //  Returns NULL
}

これは、デリゲートが呼び出される場所がNULLではなかったという理由だけで却下されます。

- (void)dismiss:(id)sender
{
    NSLog(@"5 %@",_delegate); // Returns NULL

    [self.delegate aMethod];
}

アップデート

weak私はとstrong参照の両方を使用しました。また、との両方self.delegateを使用_delegateしてプロパティにアクセスしました。そして、ポイントとして、aMethodコールバックが通過していません。これが、この探偵の仕事がどこで失われているのかを見つけるように促した理由です。

4

2 に答える 2

2

最初は、delegateプロパティは常にでなければなりません weak。さもなければunsafe_unretainedARC互いに強いポインタを持つクラスの割り当てを解除できません。

@property (weak, nonatomic) id <SDStoreViewDelegate> delegate;

また

@property (unsafe_unretained, nonatomic) id <SDStoreViewDelegate> delegate;

delegateゲッターを介してプロパティにアクセスしようとしなかったのはなぜですか? このような:

NSLog(@"4 %@",self.delegate);

それ以外の

NSLog(@"4 %@",_delegate);

おまけの質問: あなたのメソッドはその行でコールバックされましたか?

[self.delegate aMethod];

答えが「はい」の場合、あなたは紛失していません。答えが「いいえ」の場合、どこdelegateに設定しますか?delegate

于 2012-08-27T19:26:08.503 に答える
0

set および get メソッドを実装ファイルに追加します。合成機能のすぐ隣。

@synthesize delegate = _delegate;
- (id)delegate{
    return _delegate; // Add a breakpoint here
}
- (void) setDelegate:(id) delegate {
    if (_delegate != delegate){
        _delegate = delegate; // Add a breakpoint here
    }
}

また、メソッドにブレークポイントを配置し、initWithCoder:そこに正しく入っているかどうかを確認します。

于 2012-08-27T19:19:57.330 に答える