iOSでdelegateエージェントオブジェクトがweakを使用

1130 ワード

今までずっと応用していたのはassignで、本日コードをデバッグする时间、発明の顺番はcrashが落ち込んで、EXCを间违えます_BAD_ACCESSは検討を経て、@property(nonatomic,assign,readwrite)id delegateを適用することを発明した.delegateを宣言すると
以前はずっとassignを使っていましたが、今日コードをデバッグしたとき、プログラムがcrashを落とすことに気づき、EXCを間違えました.BAD_ACCESS
研究の結果、もし
@property (nonatomic, assign, readwrite) id delegate;
delegateを宣言すると、delegateが指すオブジェクトが破棄されても、delegateには以前のオブジェクトのアドレスが保存されます.
つまりdelegateは野ポインタになりました...
weakを使用すると、delegateが指すオブジェクトが破棄されるとdelegate=nilという問題はありません.
--------------------------------------------
答えはweakを使うことです
エージェントweak
UILabel、コントロールstrong
NString            Copy
intデータ型のassign
次の2つの方法は弱いリファレンスエージェントオブジェクトですが、1つ目はエージェントオブジェクトが解放された後にクラッシュを起こさず、2つ目はクラッシュを招きます.
 
1
2 @property (nonatomic, weak) iddelegate; @property (nonatomic, assign) iddelegate;
Weakとassignは「非所有関係」のポインタであり、この2つの修飾子で修飾されたポインタ変数によって、参照されるオブジェクトの参照数は変更されません.しかし、1つのオブジェクトが解放されると、weakは自動的にnilにポインタを指し、assignはしません.iOSでは、nilにメッセージを送信するとクラッシュしないため、assignは野ポインタのエラーunrecognized selector sent to instanceを引き起こします.
エージェント属性を修飾するにはweakで修飾したほうが安全です