Objective-Cであるクラスから、特定のViewControllerのもつLabel要素へテキストを表示したく、色々試してみたのですが、うまく動作しませんでした。
詳しい方、ぜひアドバイスお願いします。
□やりたいこと
クラス側から、ViewControllerの持つ要素を操作したい
□テストで使用したコード
test_buttonをクリックすると、lbl_mesへ文字列を表示する
-----------------
■classTest.h
#import "helloViewController.h"
-----------------
■classTest.m
#import "classTest.h"
- (void) makeStr {
helloViewController *hv = [[helloViewController alloc] init];
hv->lbl_mes.text = @"HELLO WORLD";
[hv release];
}
-----------------
■helloViewController.h
#import "classTest.h"
@interface helloViewController : UIViewController {
@public
IBOutlet UILabel* lbl_mes;
}
@property(nonatomic,retain) IBOutlet UILabel* lbl_mes;
-(IBAction) test_button;
-----------------
■helloViewController.m
#import "helloViewController.h"
-(IBAction) test_button{
classTest *clst = [[classTest alloc] init];
[clst makeStr];
[clst release];
}
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
改訂後のプログラムは、打って変わって90点のできですね。
すばらしいです。なお、100点に足りない10点分の説明をしておきます。
- (void)dealloc {
[super dealloc];
[share_string release];
}
「[super dealloc]」は、すべてのインスタンスの開放をしたのち、最後に行います。「init」(初期化)のときとは、逆の処理をするのですね。
share_string = @"HELLO WORLD";
この形で生成したNSStringインスタンスは、開放する必要がありません。NSStringは、すこし特殊なクラスです。これは「オブジェクト定数」といって、元のインスタンスが存在している間じゅう、開放されずに残ります。「#define」で宣言した定数のように扱えます。
harawoさん、改訂版の採点までしていただきありがとうございます! 結構いい点数をもらえてちょっと安心しました。(ちょっと不安でしたw)
残りの10点分の指摘もすごく勉強になり、本当に感謝です。ありがとうございました!
No.1
- 回答日時:
問題点はひとつだけではない(というか、まともな行のほうが少ない)し、すべて指摘することはできない(しようとするなら、有料にせざるを得ない)ので、ざっとだけ列挙してみます。
まず、直接関係ない、訂正しなくてもかまわないが、いま矯正しておかないと、将来延々と困ったことになることについて:
(1) クラス名は大文字で始める規則になっています。べつに小文字で始めても,コンパイルは通りますが、インスタンスを代入した変数と区別ができないため、致命的なミスを引き起こす要因になります。クラス名は大文字で始め、インスタンスを代入した変数を含め、変数名は小文字で始める規則になっています。
(2) 別インスタンスから、インスタンス変数の参照(hv->lbl_mes)は、Objective-Cの文法上できることになってますが、じっさいに使うことはありません。その代わりにプロパティを使うからです。ましてや、インスタンス変数の参照とプロパティの参照を、同時に行うことなど、混乱を引き起こすだけで、メリットはありません。
(3) 「IBOutlet」、「IBAction」は、Interface Builderと連携するときに使用する、目印であって、Interface Builderなしでプログラムするときには不用です。コンパイル時、IBOutletはスペースに、IBActionはvoidに置換されます。また、IBOutletの宣言は、インスタンス変数か、プロパティのいずれかひとつで行えばいいのであって、二度以上宣言する必要はありません。
つぎに、重大な問題について:
(1) UIViewController(とそのサブクラス)のViewは、生成しただけでは、画面に表示されません。親View(superview)かWindowに「addSubview」することで、初めて表示されます。
(2) インスタンスを生成したら、いつか開放(release)しなければならないのは、そのとおりです。が、確実にそのインスタンスが使われないという保証がないのに、とうめん用が終わったからといって、開放してはいけません。開放は、NSObject(すべてのクラスのスーパークラス)のメソッド「dealloc」で行うといいでしょう。
そして、このプログラムの抱えている矛盾について:
helloViewControllerのインスタンス内で、classTestのインスタンスclstを生成し、clstのメソッドmakeStrで、helloViewControllerのインスタンスを生成しています。では最初のhelloViewControllerインスタンスと、最後のhelloViewControllerインスタンスの関係は?同一のインスタンスにはなりません。べつべつのインスタンスです。
harawoさん、ご指摘ありがとうございました。
曖昧なまま根本的な所が間違っていたままテストしていたことに気づかされ、harawoさんのアドバイスを踏まえながら、基本を見直してみました。
まだ、おかしな点も多いかもしれないですが、下みたいに変更し、プロパティを用いてラベルに値を表示することができました。
まだ曖昧な部分も多いので、色々と勉強してみます。ありがとうございました!
-----------------
■ClassTest.h
@interface ClassTest : NSObject {
NSString *share_string;
}
@property(nonatomic,retain) NSString *share_string;
- (void) makeStr;
-----------------
■ClassTest.m
#import "ClassTest.h"
@implementation ClassTest
@synthesize share_string;
- (void) makeStr {
share_string = @"HELLO WORLD";
}
- (void)dealloc {
[super dealloc];
[share_string release];
}
-----------------
■HelloViewController.h
@interface HelloViewControllerViewController : UIViewController {
IBOutlet UILabel* lbl_mes;
}
-(IBAction) test_button;
-----------------
■HelloViewController.m
#import "HelloViewControllerViewController.h"
#import "ClassTest.h"
@implementation HelloViewControllerViewController
-(IBAction) test_button{
ClassTest *classTest = [[ClassTest alloc] init];
[classTest makeStr];
lbl_mes.text = classTest.share_string;
[classTest release];
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- その他(パソコン・スマホ・電化製品) pthonのframeに演算結果(数値)を表示したい 1 2023/06/05 22:08
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- オープンソース Flaskでサーバー立ち上げに関して 1 2023/08/12 21:02
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
VB.NET getとsetの概念がわかり...
-
フォームの存在をチェックする方法
-
C# インスタンスの破棄
-
「共有メンバにアクセスするイ...
-
メソッドの引数としてのthisの意味
-
オブジェクト参照がオブジェク...
-
「インスタンス」の意味をわか...
-
インスタンスを同じ名前で作成...
-
生成したインスタンスを削除す...
-
整数の引数に列挙を使ったとき
-
マルチスレッド間でデータ交換...
-
String a = "a"; と String b =...
-
javaのクラスの作り方、エラー...
-
VB6.0のクラスで、自分自身のイ...
-
VB.netで標準モジュールからフ...
-
非staticフィールドを参照でき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
VB6.0で、DLLを動的に参照したい
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
-
「インスタンス」の意味をわか...
-
SetWindowsHookExで質問
-
フィールドでのnewとコンストラ...
おすすめ情報