私は弱い参照と強い参照の使用、およびそれらをいつ使用するか、いつ使用しないかに慣れてきており、以下に説明するようなケースになりました(警告に関するコメントを確認してください)
@interface MPIViewController ()
@property (weak, nonatomic) UIView *subview;
@property (weak, nonatomic) UILabel *label;
@end
@implementation MPIViewController
// ...
// some code here
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
self.subview = [[UIView alloc] init]; // warning here: assigning retained object to weak property
self.label = [[UILabel alloc] init]; // no warnings
[self.view addSubView: self.subview];
[self.view addSubView: self.label];
}
// ...
// some code here
// ...
@end
の説明から- (void)addSubview:(UIView *)view
:
このメソッドは、ビューへの強力な参照を確立し、次のレスポンダーを新しいスーパービューであるレシーバーに設定します。
これは、このオブジェクトがdeallocated
メソッドの終了後に存在しないことを意味します。これは、オブジェクトsuperview
を保持し、強い参照を保持するため、スーパービューが存在する限り、このビューがメモリに保持されるためです。私はここにいますか?
ここでの割り当てを正しく理解しているかどうかもわかりません。警告は、割り当ての直後になると言っていますが、コードの次の行でdeallocated
得られるように、弱いポインターに変数を割り当てることができないため、これは間違っているように聞こえますか?deallocated
UILabel
同じ割り当ての場合は正常に機能しますが、そうUIView
ではありませんか? コンパイラは UIView をどうにかして扱いますか? これは、それがどのように可能であるかを本当に困惑させます。
このコードは、UIView をローカル メソッド変数に割り当ててから、次のようにセッターに渡すだけで簡単に修正できます。
UIView *tmpView = [[UIView alloc] init];
self.subview = tmpView;
メソッドで宣言された変数はデフォルトであり、strong
そのような構造を持つことで警告が削除されます。これは、コンパイラがこの変数に強い参照があると見なすため、メソッド変数がそれを指している限り、その後に割り当てられる弱い参照が保持されるためです。しかし!tmpView はローカルメソッド変数にすぎず、メソッドが終了した後にダンプされるので、それはどのように意味がありますか?