2011-08-14 24 views
2

-viewDidLoadメソッドで初期化するいくつかのivar NSArrayがあります。 1つは文字列を含み、1つはIBOutletsを含む。しかし、私が初期化すると、配列内のオブジェクトはすべてスコープ外になり、メモリアドレスは0x0(Xcodeデバッガによる)です。しかし、私は同じオブジェクトを持つローカルNSArrayを持って、それは正常に動作します。 ivarの初期化NSStringまたはNSDictionaryはうまくいきます。Cocoa Touch NSArrayの初期化が正しく動作しません。

コード:

//.h file 
#import <UIKit/UIKit.h> 
@interface myViewController : UIViewController 
{ 
NSArray *myArray; 
} 
@end 

//.m file 
#import "myViewController.h" 
@implementation myViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil]; 
    NSLog(@"myArray equals: %@.", myArray); 
} 
@end 

私は配列を使用しようとすると、私はEXC_BAD_ACCESSのランタイムエラーが発生します。これはXcodeのバグですか、NSArrayについて何か不足していますか?更新:私はARCを使用しています。 ARCをオフにしてクリーンなビルドを行った後、私はもはやこの問題を抱えません。これはARCのバグですか?

問題の原因はわかりませんが、安定したバージョンのXcode(4.0.2)に切り替えましたが、全く問題はありませんでした。助けようとしてくれてありがとう!

答えて

2

ARCを使用していることは、このような質問をするときに注意することが重要です。

どのように配列(コードを表示)を使用しようとしていますか?特定のバージョンのARC(iOS側で議論することはできませんが、ARCのLionリリースにも同じバグがあります)には既知のバグがあります。ARCでのコレクションの高速列挙によりクラッシュする可能性があります。

+0

現在のところ、私は単にそれをNSLogにしようとしています。コードは 'NSLog(@"%@ "、myArray);' – futurevilla216

+0

最小限の例を投稿できますか? – bbum

+0

さて、元の投稿を更新します。 – futurevilla216

0

フレームワークのようなサウンドは、まだIBOutletインスタンスをインスタンス化していません。 viewWillAppearメソッドで配列を保持して配置できますか?これは、ユーザーが何かを見る前に呼び出されます。さもなければ、それらをIBから引き出し、手動でそれらを管理し、あなたが望む任意のポイントでそれらを割り当てる。

+0

私はそれがIBOutletの問題ではないと思います。なぜなら、NSStringだけの配列を持っている場合、同じ問題が発生するからです。 – futurevilla216

0

サンプルコードでは、ヘッダーファイルで宣言したiVarを設定するのではなく、新しい(ローカル)バージョンのmyArrayを割り当てているようです。変更してみてください:

NSArray *myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil]; 

myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil]; 

にARCでオフ、私はそれがnilに設定されますので、あなたはmyarrayのにアクセスするために作成したすべての試みは何もしないだろうと推測してすべてのメッセージを無視します。私はなぜこのコードがARCを有効にしていても違うのか分かりません。

+0

はい、それは私がやったことです、私はちょうどタイプミスをしました。ごめんなさい! ARCをオンにすると、まったく動作しません。 ARCをオフにすると、正常に動作します。 – futurevilla216

関連する問題