1

ボタンにブロックが接続されています(このカテゴリを使用):

__unsafe_unretained typeof(UIImage) *weakPic = originalPic;
[button addEventHandler:^{
    switch (state) {
    case state1:
        {
           UIViewController *vc = //some VC
           vc.pic = weakPic; // weakPic is nil at this point
                             // putting originalPic here would solve my problem
                             // but then I would have a retain cycle


        }  

    case state2:
        {
          // other stuff
        }
    }

}];

ボタンに関連付けられたアクションは、状態によって異なります。

ここに問題があります。保持サイクルを避けるために、上記を維持する必要があります。ただし、このコードは..__unsafe_unretainedの時点で呼び出されるため、に割り当てるとnil 値が割り当てられます。だけに置き換えると、正常に動作します..(更新された値になります)が、保持サイクルが発生します..アイデア?originalPic = nilweakPicvc.picweakPicoriginalPicoriginalPic

4

2 に答える 2

1

コードについて詳しく知らなくても、weakSelf を宣言し、self にアクセサーを実装することを検討することをお勧めします。

//the accessor
-(UIImage*)pic{
    return originalPic;
}

-(void)someSetupMethod{
    __weak id weakSelf = self;

    [button addEventHandler:^{
        switch (state) {
        case state1:
            {
               UIViewController *vc = //some VC
               vc.pic = [weakSelf pic]; // if weakself is nil at this point, then
                                        // originalPic is likely invalid


            }  

        case state2:
            {
              // other stuff
            }
        }

    }];
}

必要なweakSelfではないかもしれませんが、他のオブジェクトです。その場合、他のオブジェクトがボタンと同じかそれよりも長く存在することが比較的確実である限り、そのオブジェクトを弱いと宣言するだけです。

于 2013-09-16T15:27:14.753 に答える
-1

__block 変数として宣言することも検討してください。__block キーワードは、ブロック内でオブジェクトのコピーが作成されるのを防ぎます。

__weak および __block 参照のより良い説明については、このスレッドを参照してください。

于 2013-09-16T16:14:16.237 に答える