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;
}
よろしくお願い致します!!
No.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];
と呼び出します。
ありがとうございます!以後気をつけます!ご指摘ありがとうございます。
>※表題にObjective-CあるいはiOS SDKに関する質問であることを、わからせる語句を入れとかないと、答えてくれそうな人がスルーしてしまいそうですね。ご一考を。
おかげさまできちんと動きました!
原因は+(AppData *)sharedDataでした!
「クラスメソッドで、インスタンス変数に代入してはいけない。」といったことが
『詳解objectiveーC』のクラスメソッドに書いてありました。
一度initでインスタンス化してから
インスタンス変数にアクセスすることで解決できました!
このやり方なら、例えば「あるデータモデルオブジェクトをいろんなクラスで使い回す」といったことが可能になるという認識でよさそうですね!
大変、勉強になります!
>クラスAppDataのプロパティresponseJsonDataArrayなどが、動的な変化をせず、常に同じ値で、定数的な扱いをするのならば、プロパティではなくて、クラスメソッドとして定義したほうが、使いやすいです。(その場合は、クラスAppDataの初期化メソッドは不要になります)
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby 教えてください 2 2023/01/04 17:50
- Word(ワード) Word 2016のマクロを Word 2021のWordでキー動作させたい 3 2023/04/12 16:14
- Word(ワード) office 2021へ自分用のクイックアクセスとマクロをコピーしたい 2 2023/03/11 21:15
- Java jdk17.06のインストーラーが起動しない 1 2023/03/27 21:58
- Windows 10 パソコンの操作ができません。。。 4 2022/06/02 18:38
- Ruby パイソンエラーについて 1 2022/12/24 14:07
- サーバー WindowsでApache が起動しない 1 2022/11/29 12:21
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- その他(プログラミング・Web制作) Arduinoに関する質問 4 2023/08/07 21:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
C# 点の描き方をおしえてくだ...
-
contextってなんですか?
-
c++のキュー
-
C# 他のnamespaceにあるメソッ...
-
オーバーロード、オーバーライ...
-
Strutsでチェックボックスの値...
-
YYYYMMDD書式の日付に対する適...
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
エクセルVBAで、条件に一致する...
-
3年間同じクラスになる確率
-
インスタンス参照でアクセスで...
-
c++,ある関数のクラスから別の...
-
ワイルドカード<?>と型パラメー...
-
「天声人語」をインターネット...
-
DataGridViewでセルクリックイ...
-
string formatについて
-
クラス間でのデータ参照
-
変数の参照でエラーが出てしま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
public static void main (Stri...
-
レコード件数の表示
-
abstract と static を一緒に付...
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
コマンドライン引数のチェック
-
String.containsの反対機能はあ...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
Java初心者です、エラーの意味...
-
javaに"search"という関数 or ...
-
C# でメソッドに送られてきたOb...
-
YYYYMMDD書式の日付に対する適...
-
メソッド宣言の戻り値の型にク...
-
return new使用時
-
readLine()ではじめから読み直...
-
シェルスクリプトからのJavaメ...
-
Fileの読み取り専用の解除
-
親の親のメソッドを呼ぶには?
おすすめ情報