2

-viewDidLoadメソッドで初期化するivarNSArrayがいくつかあります。1つには文字列が含まれ、もう1つにはIBOutletsが含まれます。ただし、初期化すると、配列内のすべてのオブジェクトがスコープ外になり、メモリアドレスは0x0になります(Xcodeデバッガーによる)。ただし、同じオブジェクトを持つローカルNSArrayがある場合は、正常に機能します。ivarNSStringまたはNSDictionaryの初期化はどちらも正常に機能します。

コード:

//.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)に切り替えて、何の問題もありませんでした。助けてくれてありがとう!

4

3 に答える 3

2

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

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

于 2011-08-14T17:52:48.263 に答える
0

フレームワークが IBOutlet インスタンスをまだインスタンス化していないようです。viewWillAppear メソッドで配列にデータを入力するのを延期できますか? これは、ユーザーが何かを見る前に呼び出されます。それ以外の場合は、IB からそれらを引き出し、手動で管理し、必要な時点でそれらを割り当てます。

于 2011-08-14T17:56:34.233 に答える
0

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

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

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

ARC をオフにすると、myArray にアクセスしようとしても、nil に設定されてすべてのメッセージが無視されるため、何も起こらないと思います。ARC が有効になっていると、このコードが異なる動作をする理由がわかりません。

于 2011-08-14T18:46:47.800 に答える