2011-08-18 3 views
16

をコピーまたは保持EXC_BAD_ACCESS:例えば、その中にコピーを送ることができるか、それにメッセージをリリース、私の知る限りは、ブロックは、オブジェクトのように機能を理解するように、ブロック

[myBlock copy]; 

をしかし、私はこれを行うたび、またはリリースブロック、私はEXC_BAD_ACCESSを取得します。

私はブロックの機能を使用する場合は、予想通り、すべてが例えば、作品:

Block_copy(myBlock); 

私はブロックを解放し、コピーの両方の方法が同一であったと思いましたか?

それはそれほど問題ではありませんが、ブロックであるプロパティ(コピー)があれば、自分でセッターメソッドを記述する必要があります。例えば

:プロパティを持つ:cancelledBlock

を設定するときに

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; 

はEXC_BAD_ACCESSにつながるが、私がしなければ:

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; //saves me doing the getter as well 

- (void)setCancelledBlock:(void (^)(void))aCancelledBlock { 
    if (cancelledBlock == aCancelledBlock) { 
     return; 
    } 
    void (^oldValue)(void) = cancelledBlock; 
    cancelledBlock = Block_copy(aCancelledBlock); 
    Block_release(oldValue); 

} 

何EXC_BAD_ACCESSはありませんし、それが必要としてすべてが実行されます。

+0

以前に保持またはコピーしたものだけをリリースしてください。 – Richard

+0

私は私の質問で言うように、[myBlock copy]はEXC_BAD_ACCESSを返しますが、 'Block_copy(myBlock)'はしません。 –

+0

完全な例を教えてください。 –

答えて

26

久しぶりの退屈な午後と夜の後、私は最終的にこれを見つけ出しましたanswer here、それは無関係に見えるかもしれませんが、私がそれを見つけるために訪問したウェブサイトのチェーンは、

基本的に私は-weak_library /usr/lib/libSystem.B.dylibをリンカフラグから削除し、-weak-lSystemに置き換えなければなりませんでした。

+0

ありがとう、ジョナサン! 4時間以上過ごした後、あなたは私の問題を解決しました! –

+0

Whoa。私は文字通り何週間も、シミュレータで起動するときに私のアプリがクラッシュする原因を突き止めようと努力してきました。この答えはそれを行いました。どうもありがとうございます! –

+0

私はこの問題をいかに迷惑にしているのか知っています。 –

関連する問題