0

必要に応じて内容を変更できる、Objective-C プロジェクト全体でアクセス可能な配列が必要です。私の問題は、別のクラスから配列を呼び出すと、常にnullになることです。それは私が望んでいることではありません。

私の.hファイルには

@interface MainScreen2 : UIViewController
@property (nonatomic, strong) NSMutableArray *Judith;

そして、私が持っている.mファイルのviewDidLoad関数で:

@interface MainScreen2 ()

@end

@implementation MainScreen2
@synthesize Judith;


- (void)viewDidLoad
{
   self.Judith = [[NSMutableArray alloc]     initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];                                                    
    [super viewDidLoad];
}

これでいいです。

別のクラスで私は持っています:

#import "MainScreen2.h"

@interface NewGame ()
@end

- (void)viewDidLoad
{
    MainScreen2 *testJudith;

    NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
    testJudithArray = [testJudith.Judith mutableCopy];
    NSLog(@"Jud test: %@", [testJudith.Judith objectAtIndex:1]);
}

は、NSLogこのポイントに対して null を返します。これは、MainScreen.h ファイルから Judith 配列を呼び出すときに、まだ読み込まれていないため、この時点では空であるためですか?

もしそうなら、誰かが配列をどこに置くべきかを手伝ってくれるので、それを呼び出すときに元の内容を保持できますか?


編集:4月30日

このページに親切に寄せられた提案の組み合わせを使用して、問題を整理し、機能するようになりました。

I changed the code to the following:

- (void)viewDidLoad
{
MainScreen2 *testJudith = [[MainScreen2 alloc]init];
[testJudith viewDidLoad];
NSString *test = [testJudith.Judith objectAtIndex:1];
NSLog(@"Jud test: %@", test);
}

フォーラムの投稿に貢献してくれたすべての人に感謝します!

4

4 に答える 4

1

このコードを見てみましょう:

MainScreen2 *testJudith;
NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
testJudithArray = [testJudith.Judith mutableCopy];

このコードには 2 つの重大な問題があります。

  1. testJudithArray初期化され、再度初期化されます。最初の値は破棄されます。ARC を使用していない限り、これはメモリ リークです。いずれにせよ、2 回初期化しても意味がありません。

  2. testJudith初期化されていません。運が良ければ、プログラムがクラッシュします。あなたは不運だったので、プログラムは間違った結果を返しました。

testJudithコードを機能させるには、初期化する必要があります。

于 2012-04-29T12:29:45.003 に答える
0

あなたが言った:MainScreen2 *testJudith;これはtestJudithをnilに設定します。

次に、配列を作成しました。

NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];

次に、testJudithArray を testJudith の Judith 配列の変更可能なコピーにリセットします。

testJudithArray = [testJudith.Judith mutableCopy];

しかし、testJudith は nil です。あなたはそれを何も設定していません。つまり、nil のプロパティは常に nil を返します。次に、nil の mutableCopy を作成しようとします。したがって、testJudithArray は nil になります。

最初に testJudith を作成していないため、変更可能なコピーを作成するように要求している配列を作成することはありません。したがって、mutableCopy メソッドは nil を返します (nil に送信されたメッセージは nil を返すため)。

これはあなたのエラーがどこにあるかを十分に説明していますか?

于 2012-04-29T12:29:16.783 に答える
0

viewDidLoadと同じではありませんinit... NSArray の割り当てを移動するか、init呼び出します[testJudith viewDidLoad];

于 2012-04-29T20:40:23.183 に答える
0

シングルトンを使用してみてください。シングルトンをグーグルで検索して、詳細を取得できます。シングルトンを使用すると、プロジェクトのどこからでも同じ文字列、配列などにアクセスできます。

新しい Objective-C クラスを追加してシングルトンを作成し、それを NSObject のサブクラスにします。例えば:

#import <Foundation/Foundation.h>
@interface MyClass : NSObject
+(MyClass *)sharedInstance;
@end

#import "MyClass.h"
@implementation MyClass
+ (MyClass *) sharedInstance
{
if (!_sharedInstance)
{
    _sharedInstance = [[MyClass alloc] init];
}
return _sharedInstance;
}
@end

NSMutableArray を MyClass に作成すると、シングルトンにアクセスしたいクラスの .m ファイルで "MyClass" を #import する限り、プログラムの他のクラスからアクセスできます。

別のクラスから MyClass 配列にアクセスするには、次のようにします。

MyClass *myClass = [MyClass sharedInstance];
NSString *myString = [[myClass someArray] objectAtIndex:1]; 

MyClass 配列に何かを追加するには、次のようにします。

[[myClass someArray] addObject:@"something"];
于 2012-04-29T20:20:17.583 に答える