プロが教える店舗&オフィスのセキュリティ対策術

AppDataというどのクラスからもアクセスできるデータモデルクラスを作り、AppDataに格納された配列のデータを
viewControllerがもつリストにセットして、テーブル表示させたいのですがうまくいかないのです。

自分の考えではポインタをきちんと理解していないorオブジェクトのインスタンス変数の寿命を把握していない。
なぜ動かないのか??どういった部分を勉強するべきか??教えていただければ幸いです!


プログラムは省略してあります。
AppDelegateクラス
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

AppData *share = [AppData sharedData]; //共通データクラス作成完了

viewController.list = share.responseJsonDataArray; ←●ここが動きません!!
デバッグさせるとresponseJsonDataArrayが初期化されていませんでした。
}

AppDataクラス
+(AppData *)sharedData {

if (!_appData) {
_appData = [[AppData alloc] init];
}
responseJsonString = [[NSString alloc] init];
responseJsonDataArray = [[NSMutableArray alloc] initWithObjects:@"kou",@"kou",nil];
↑ここに入ったデータを呼び出してテーブル表示させたい!!

return _appData;
}

よろしくお願い致します!!

A 回答 (1件)

※表題にObjective-CあるいはiOS SDKに関する質問であることを、わからせる語句を入れとかないと、答えてくれそうな人がスルーしてしまいそうですね。

ご一考を。

+(AppData *)sharedData {

if (!_appData) {
_appData = [[AppData alloc] init];
}
responseJsonString = [[NSString alloc] init];
responseJsonDataArray = [[NSMutableArray alloc] initWithObjects:@"kou",@"kou",nil];
↑ここに入ったデータを呼び出してテーブル表示させたい!!

return _appData;
}

これでもいけそうな気がしますが、標準的な初期化メソッドと、形がかけ離れているのはたしかです。また、標準の初期化メソッドは、[[~ alloc] init~]という形をとり、クラスメソッドをとる初期化メソッドは、autoreleaseを内包していることにするのが、規則ではありませんが、推奨される形態となっています。NSDataやNSArrayなどの初期化メソッドをお調べになるといいでしょう。
標準的な初期化メソッドにならって、上のメソッドを書き換えると、おおよそこうなります。

- (id)init {
self = [super init];
if (self != nil) {
responseJsonString = [[NSString alloc] init];
responseJsonDataArray = [[NSMutableArray alloc] initWithObjects:@"kou",@"kou",nil];
↑ここに入ったデータを呼び出してテーブル表示させたい!!
}
return self;
}

クラスAppDataのプロパティresponseJsonDataArrayなどが、動的な変化をせず、常に同じ値で、定数的な扱いをするのならば、プロパティではなくて、クラスメソッドとして定義したほうが、使いやすいです。(その場合は、クラスAppDataの初期化メソッドは不要になります)
クラスAppDataに実装するメソッドとして、
+ (NSArray *)responseJsonDataArray
{
return [[NSArray alloc] initWithObjects:@"kou",@"kou",nil];
}
こういうように定義し、AppDelegate内で、
viewController.list = [AppData responseJsonDataArray];
と呼び出します。
    • good
    • 0
この回答へのお礼

ありがとうございます!以後気をつけます!ご指摘ありがとうございます。

>※表題にObjective-CあるいはiOS SDKに関する質問であることを、わからせる語句を入れとかないと、答えてくれそうな人がスルーしてしまいそうですね。ご一考を。


おかげさまできちんと動きました!

原因は+(AppData *)sharedDataでした!
「クラスメソッドで、インスタンス変数に代入してはいけない。」といったことが
『詳解objectiveーC』のクラスメソッドに書いてありました。

一度initでインスタンス化してから
インスタンス変数にアクセスすることで解決できました!

このやり方なら、例えば「あるデータモデルオブジェクトをいろんなクラスで使い回す」といったことが可能になるという認識でよさそうですね!
大変、勉強になります!
>クラスAppDataのプロパティresponseJsonDataArrayなどが、動的な変化をせず、常に同じ値で、定数的な扱いをするのならば、プロパティではなくて、クラスメソッドとして定義したほうが、使いやすいです。(その場合は、クラスAppDataの初期化メソッドは不要になります)

ありがとうございます!

お礼日時:2011/03/03 13:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!