AクラスでBクラスをallocしてるとき、BクラスからAクラスのメソッドを実行するには
- 2010年 8月2日(月) 17:21 JST
- 投稿者: akira
- 表示回数 121
@classで前方宣言する方法
notificationを使ってクラス間の結合を弱める方法
delegateを使って実装を分離する方法 393 名前: 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 21:08:58 ID: eDYiMrfN0
iPhone developer program に登録したいと思ってるんですけど、購入する際にapple storeのリンクを押すと、利用できませんとか出で購入できません、どうしたらいいですか?
394 名前: [—{}@{}@{}-] 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 21:29:21 ID: 4U3yGGYPP
>>392
簡単にやるなら、BクラスにAクラスのポインタを保持するとか
395 名前: 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 22:12:47 ID: IHYy6wp60
>>394
保持しちゃダメ。循環参照になっちゃう。assignで。
396 名前: 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 23:01:14 ID: jJ3S50XS0
>>392
Bのメソッドの引数にAの参照を渡せば、Bのメソッド内部からAのメソッドを呼べるね
397 名前: 392 Mail: sage 投稿日: 2010/07/24(土) 01:38:41 ID: /b9bcHHZ0
>>394-396
素早いレスポンスありがとうございます。
1度、Aクラスからselfを引数として送ってみたんですが、
#import "ClassA.h"して
ClassA* parent;
って感じで定義したら、ビルドエラーが発生してしまって、つまづいてました。
ClassA.hをimportしないで、
NSObject* parent;
で、395さんのいうようにassignしたら、エラーなくコンパイルできて、
正常に動作してます。
もうちょっと動作確認しますが、とっかかりはうまくいきました。
ありがとうございます、感謝します。
400 名前: 392 Mail: sage 投稿日: 2010/07/24(土) 02:17:38 ID: /b9bcHHZ0
一応、動作してるんですけど、
Warningとして
'NSObject' may not respond to '-thisMethod"
がでてますね。
理由は解るんですが、正しくはどうしたらいいんでしょう?
ClassA型のポインタにしようとするとビルドエラーになってしまうし。
サンプルコードなどないでしょうか?
401 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 02:19:52 ID: GP25fjsW0
>>400
#importの代わりに@classを使って
@class ClassA;
ClassA *ca;
みたいにすればいい。
#importは.mファイルで。
405 名前: 名称未設定 Mail: 投稿日: 2010/07/24(土) 09:07:20 ID: 4taxWj2u0
>>400さんへ
私もつい最近同じ疑問を持ち、
>>392,397
とまったく同じ思考過程を辿り、同じようにどこか納得のいかない気持ちを持ちました。
ご参考まで、私のとった方法なのですが、
私の場合、調べていく中でたまたまNSNotificationCenterというクラスを知りましたので、
ClassAの中で、
NSNotificationCenter *center=[NSNotificationCenter DefaultCenter];
[center addObserver:self selector:@selector(notifyFromB:) name:@"notifyFromB" object:nil];
として、
-(void)notifyFromB:(NSNotification*)Notification{
// ここに実行させたいメソッドを書く
}
を実装し、
ClassBから、
CassAのメソッドを実行させたいタイミングで
[[NSNotificationCenter defaultCenter]postNotificationName:@"notifyFromB" object:nil userInfo:nil];
と通知を出すことで間接的にClassAのメソッドを実行させました。
調べてみると分かりますがパラメータを含ませることもできますし、
ClassAとClassBがまったく無関係の場合にも通知を行うことができるかなり強力な機構です。
通知をするための機構なので、戻り値を得ることはできませんが。
もしご存知の場合はあしからず。
私も401のやり方について調べてみようと思います。
横やり失礼。
406 名前: 243 Mail: sage 投稿日: 2010/07/24(土) 09:52:55 ID: ttQGZ/vO0
>>281
遅レス申し訳ない。
付属のスクリプト「uninstall-developer-folder」とか「uninstall-devtools」ですかね?
実行して、再インストールしてみたのですが、結果は同じでした。
多分何処かで循環参照みたいなことしちゃってるんだと思うのと、
色々気に入らないところがあるのとで、再度作り直してみようと思います。
ありがとうございました。
>>392
おいらの場合、delegateで解決しました。
間違った使い方をしてる可能性もあるけど、
おいらの中では一番スマートなやり方です。
改行数大杉言われたので別けます
407 名前: 243 Mail: sage 投稿日: 2010/07/24(土) 09:54:42 ID: ttQGZ/vO0
なんだよ40秒規制って・・・
【Bクラス.h】
@protocol BクラスDelegate;
@interface Bクラス : NSObject {
id<BクラスDelegate> delegate;
}
@property(nonatomic,assign) id<BクラスDelegate> delegate;
- (void)〜〜;
@end
@protocol BクラスDelegate <NSObject>
- (NSInteger)メソッドあれ;
- (NSString *)メソッドこれ;
@end
【Bクラス.m】
#import "Bクラス.h"
@implementation Bクラス
@synthesize delegate;
- (void)〜〜 {
NSInteger 〜〜 = [delegate メソッド];
}
@end
408 名前: 243 Mail: sage 投稿日: 2010/07/24(土) 09:56:49 ID: ttQGZ/vO0
【Aクラス.h】
#import "Bクラス.h"
@interface Aクラス : NSObject<BクラスDelegate> {
}
- (void)〜〜;
@end
【Aクラス.m】
#import "Aクラス.h"
#import "Bクラス.h"
@implementation Aクラス
- (void)〜〜 {
Bクラス *インスタンス = [[Bクラス alloc] init];
インスタンス.delegate = self;
}
- (NSInteger)メソッド {
:
}
@end
409 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 11:25:09 ID: P5296q1k0
AppDelegate *sharedDelegate = [UIApplication sharedApplication];
[sharedDelegate Aクラス].メソッド
これではだめですか?
410 名前: 392 Mail: sage 投稿日: 2010/07/24(土) 11:51:10 ID: /b9bcHHZ0
>>401
完全にWarnigが消えました。ありがとうございます。
このやり方は、初めて見ました。とても勉強になりました。
経験豊富な方なのですね、尊敬します。
>>405
親切にありがとうございます。
そのやり方、ネットで検索していて、ちらっとみた記憶があります。
とりあえず、401さんの方法が正当派な感じがします。
ぜひ使ってみてください。
411 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 12:04:07 ID: s50GR6PFP
お前ら詳解Objective-Cぐらい読んどけよ
@classで前方宣言する方法
notificationを使ってクラス間の結合を弱める方法
delegateを使って実装を分離する方法
全部書いてるっつーの
412 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 12:20:32 ID: zF131Y3V0
そんなこと後からドヤ顔で言われてもw
413 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 12:43:06 ID: jQqwV5/+0
>>411
タブ間のビュー同士でデータ受け渡しする方法も書いてる?Global以外の方法で。
notificationを使ってクラス間の結合を弱める方法
delegateを使って実装を分離する方法 393 名前: 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 21:08:58 ID: eDYiMrfN0
iPhone developer program に登録したいと思ってるんですけど、購入する際にapple storeのリンクを押すと、利用できませんとか出で購入できません、どうしたらいいですか?
394 名前: [—{}@{}@{}-] 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 21:29:21 ID: 4U3yGGYPP
>>392
簡単にやるなら、BクラスにAクラスのポインタを保持するとか
395 名前: 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 22:12:47 ID: IHYy6wp60
>>394
保持しちゃダメ。循環参照になっちゃう。assignで。
396 名前: 名称未設定 Mail: sage 投稿日: 2010/07/23(金) 23:01:14 ID: jJ3S50XS0
>>392
Bのメソッドの引数にAの参照を渡せば、Bのメソッド内部からAのメソッドを呼べるね
397 名前: 392 Mail: sage 投稿日: 2010/07/24(土) 01:38:41 ID: /b9bcHHZ0
>>394-396
素早いレスポンスありがとうございます。
1度、Aクラスからselfを引数として送ってみたんですが、
#import "ClassA.h"して
ClassA* parent;
って感じで定義したら、ビルドエラーが発生してしまって、つまづいてました。
ClassA.hをimportしないで、
NSObject* parent;
で、395さんのいうようにassignしたら、エラーなくコンパイルできて、
正常に動作してます。
もうちょっと動作確認しますが、とっかかりはうまくいきました。
ありがとうございます、感謝します。
400 名前: 392 Mail: sage 投稿日: 2010/07/24(土) 02:17:38 ID: /b9bcHHZ0
一応、動作してるんですけど、
Warningとして
'NSObject' may not respond to '-thisMethod"
がでてますね。
理由は解るんですが、正しくはどうしたらいいんでしょう?
ClassA型のポインタにしようとするとビルドエラーになってしまうし。
サンプルコードなどないでしょうか?
401 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 02:19:52 ID: GP25fjsW0
>>400
#importの代わりに@classを使って
@class ClassA;
ClassA *ca;
みたいにすればいい。
#importは.mファイルで。
405 名前: 名称未設定 Mail: 投稿日: 2010/07/24(土) 09:07:20 ID: 4taxWj2u0
>>400さんへ
私もつい最近同じ疑問を持ち、
>>392,397
とまったく同じ思考過程を辿り、同じようにどこか納得のいかない気持ちを持ちました。
ご参考まで、私のとった方法なのですが、
私の場合、調べていく中でたまたまNSNotificationCenterというクラスを知りましたので、
ClassAの中で、
NSNotificationCenter *center=[NSNotificationCenter DefaultCenter];
[center addObserver:self selector:@selector(notifyFromB:) name:@"notifyFromB" object:nil];
として、
-(void)notifyFromB:(NSNotification*)Notification{
// ここに実行させたいメソッドを書く
}
を実装し、
ClassBから、
CassAのメソッドを実行させたいタイミングで
[[NSNotificationCenter defaultCenter]postNotificationName:@"notifyFromB" object:nil userInfo:nil];
と通知を出すことで間接的にClassAのメソッドを実行させました。
調べてみると分かりますがパラメータを含ませることもできますし、
ClassAとClassBがまったく無関係の場合にも通知を行うことができるかなり強力な機構です。
通知をするための機構なので、戻り値を得ることはできませんが。
もしご存知の場合はあしからず。
私も401のやり方について調べてみようと思います。
横やり失礼。
406 名前: 243 Mail: sage 投稿日: 2010/07/24(土) 09:52:55 ID: ttQGZ/vO0
>>281
遅レス申し訳ない。
付属のスクリプト「uninstall-developer-folder」とか「uninstall-devtools」ですかね?
実行して、再インストールしてみたのですが、結果は同じでした。
多分何処かで循環参照みたいなことしちゃってるんだと思うのと、
色々気に入らないところがあるのとで、再度作り直してみようと思います。
ありがとうございました。
>>392
おいらの場合、delegateで解決しました。
間違った使い方をしてる可能性もあるけど、
おいらの中では一番スマートなやり方です。
改行数大杉言われたので別けます
407 名前: 243 Mail: sage 投稿日: 2010/07/24(土) 09:54:42 ID: ttQGZ/vO0
なんだよ40秒規制って・・・
【Bクラス.h】
@protocol BクラスDelegate;
@interface Bクラス : NSObject {
id<BクラスDelegate> delegate;
}
@property(nonatomic,assign) id<BクラスDelegate> delegate;
- (void)〜〜;
@end
@protocol BクラスDelegate <NSObject>
- (NSInteger)メソッドあれ;
- (NSString *)メソッドこれ;
@end
【Bクラス.m】
#import "Bクラス.h"
@implementation Bクラス
@synthesize delegate;
- (void)〜〜 {
NSInteger 〜〜 = [delegate メソッド];
}
@end
408 名前: 243 Mail: sage 投稿日: 2010/07/24(土) 09:56:49 ID: ttQGZ/vO0
【Aクラス.h】
#import "Bクラス.h"
@interface Aクラス : NSObject<BクラスDelegate> {
}
- (void)〜〜;
@end
【Aクラス.m】
#import "Aクラス.h"
#import "Bクラス.h"
@implementation Aクラス
- (void)〜〜 {
Bクラス *インスタンス = [[Bクラス alloc] init];
インスタンス.delegate = self;
}
- (NSInteger)メソッド {
:
}
@end
409 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 11:25:09 ID: P5296q1k0
AppDelegate *sharedDelegate = [UIApplication sharedApplication];
[sharedDelegate Aクラス].メソッド
これではだめですか?
410 名前: 392 Mail: sage 投稿日: 2010/07/24(土) 11:51:10 ID: /b9bcHHZ0
>>401
完全にWarnigが消えました。ありがとうございます。
このやり方は、初めて見ました。とても勉強になりました。
経験豊富な方なのですね、尊敬します。
>>405
親切にありがとうございます。
そのやり方、ネットで検索していて、ちらっとみた記憶があります。
とりあえず、401さんの方法が正当派な感じがします。
ぜひ使ってみてください。
411 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 12:04:07 ID: s50GR6PFP
お前ら詳解Objective-Cぐらい読んどけよ
@classで前方宣言する方法
notificationを使ってクラス間の結合を弱める方法
delegateを使って実装を分離する方法
全部書いてるっつーの
412 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 12:20:32 ID: zF131Y3V0
そんなこと後からドヤ顔で言われてもw
413 名前: 名称未設定 Mail: sage 投稿日: 2010/07/24(土) 12:43:06 ID: jQqwV5/+0
>>411
タブ間のビュー同士でデータ受け渡しする方法も書いてる?Global以外の方法で。