2012-04-22 20 views
1

私は、私のViewController.marrなぜObjective-CとiOSで[[NSMutableArray alloc] init]が警告を出しましたが、NSMutableArray.newは警告を出しませんでしたか?

@property NSMutableArray *arr; 

を私MainViewクラスのプロパティを持っているが、私は

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

を使用している場合viewDidLoadの内側に、それはコンパイルされますが、安全ではないに「割り当て保持オブジェクトの警告を与えましたオブジェクトは割り当て後に解放されます "。しかし、私が上の2行目を

mainView.arr = NSMutableArray.new;  

に変更すると、警告は表示されません。私はalloc initnewと同じだと思いましたか?最初のバージョンでは警告が表示され、実際には危険なのはなぜですか、警告が表示されないようにできますか?

+0

これはどのバージョンのXcodeですか? –

+0

Xcode 4.3.2 ..現在のもの –

答えて

1

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

P.S. 「(強い、非原子的)」とは、自動参照カウント(ARC)を使用する場合のアプローチです。私もNSMutableArray.newが働いていて驚いています。私は "[[NSMutableArray alloc] init]"を使う方が良いと思います。このようにして、インスタンス化しているクラスがより適切で特殊な初期化子(例: "initWithFrame:")を持っているかどうかをXcodeが教えてくれます。

+0

'(強い、非原子的な)'と '(保持する)'は警告を消して、プログラムはうまくいった...私はちょうどどちらのバージョンが標準であるかわからないより一般的な使用法? –

+0

+ newは、+ alloc/-initと同じことを行うために書かれているので、バグというコンパイラの警告がありません。 –

1

あなたはプロパティのタイプを伝える必要があります。たとえば:

@property (retain) NSMutableArray *arr; 

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

+0

'(強い、非原子的)'と '(保持する)'は警告を消し、プログラムはうまくいった。私はちょうどバージョンがより標準的であるか、より一般的な使用法であるか分からないのですか? –

+1

ARCには強く、非ARCには使用しないでください。 – Rob

+0

より速く非原子的です。 iOSでの使用(strong、nonatomic)で、mac(retain)で。 –

2

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

@property (strong, nonatomic) NSMutableArray *arr; 

あなたの問題は解決します。

NSMutableArray.newという非標準的な使用法からの警告がないことは、問題はないことを示すものではなく、コンパイラが警告を生成していないことを示しています。 (実際には、メソッドを呼び出すためのドット構文はまったく機能しませんでした。ドット表記法は一般的にプロパティにアクセスするためであり、メソッドを呼び出すためではありません)newを実際に使用する場合は[NSMutableArray new]構文を使用してください。しかし、好ましい構文は実際には[[NSMutableArray alloc] init]です。

警告にご注意ください。

+0

面白い...警告があっても配列とaddObjectを問題なく配列にアクセスすることができました.3分後にオブジェクトが配列に追加されてもOKです... –

+0

AreあなたはARCを使用していますか?私が記述する振る舞いは、ARCコードに関連しています。もしそうでなければ、あなたは@ Nikolaiのretain構文を使って警告を消してしまいます。しかし、関係なく、あなたのプロパティの属性なしでコードを残したくないです。 – Rob

+0

私のARCプロジェクトでは配列に文字列を追加できましたが、 'NSLog(@"%@ "、mainView.arr)'を実行したときにEXC_BAD_ACCESSを取得しました。 – Rob

関連する問題