1

私は自分のMainViewクラスのプロパティを持っています。arr

@property NSMutableArray *arr;

ViewController.mの中viewDidLoadで、私が使用する場合

MainView *mainView = (MainView *) self.view;
mainView.arr = [[NSMutableArray alloc] init];

コンパイルしましたが、「保持されたオブジェクトを安全でないプロパティに割り当てています。オブジェクトは割り当て後に解放されます」という警告が表示されました。しかし、上記の2行目を次のように変更すると

mainView.arr = NSMutableArray.new;    

その後、警告はありません。alloc initと同じだと思いましたnewか?なぜ最初のバージョンで警告が表示され、実際には危険なのか、それとも警告が表示されないようにすることができるのでしょうか?

4

3 に答える 3

2

構文を使用する[NSMutableArray new]と警告が表示されるため、問題が解決したのではなく、非標準の構文がNSMutableArray.new警告を生成しなかったことが問題です。問題は、プロパティがデフォルトで unsafe_unretained になっていることです。保持されたオブジェクトを unsafe_unretained オブジェクトに割り当てると、ARC はすぐにそれを解放します。配列にオブジェクトを追加してから NSLog を実行すると、問題を示す EXC_BAD_ACCESS が表示されます。プロパティを次のように変更します。

@property (strong, nonatomic) NSMutableArray *arr;

そしてあなたの問題はなくなります。

繰り返しますが、非標準の使用法による警告の欠如は、NSMutableArray.new問題がないことを示すものではなく、コンパイラが警告を生成しなかったことを示しています。(率直に言って、メソッドを呼び出すためのドット構文がまったく機能したことに本当に驚いています。ドット表記は通常、メソッドを呼び出すためではなく、プロパティにアクセスするために使用されます。)[NSMutableArray new]本当に使用したい場合は、構文を使用してくださいnew。しかし、推奨される構文は実際には[[NSMutableArray alloc] init].

警告に注意してください。

于 2012-04-22T04:35:19.953 に答える
1

警告が表示される理由は、arrが強力な参照ではないためだと思います。「@property(strong、nonatomic)NSMutableArray * arr;」を試してみると、警告は消えます。

PS "(strong、nonatomic)"は、自動参照カウント(ARC)を使用する場合に使用するアプローチです。NSMutableArray.newが機能したことにも驚いています。「[[NSMutableArrayalloc]init]」を使用する方が良いと思います。そうすれば、Xcodeは、インスタンス化するクラスに、より適切な特殊な初期化子( "initWithFrame:"など)があるかどうかを通知します。

于 2012-04-22T04:18:13.860 に答える
1

プロパティの種類を指定する必要があります。例えば:

@property (retain) NSMutableArray *arr;

ドキュメントのプロパティタイプを参照してください。

于 2012-04-22T04:26:58.047 に答える