編集:問題解決済み!クリーニングしてリブートした後、ただ消えた!私はこの原因を知りません!Xcode4の新しいLLVMコンパイラはクラスの継承を正しく機能させませんか?
は、これが今の私に完全な一日のために頭痛を引き起こした:Xcodeの3.2のすべてで
は優秀働きました。それから私は4.2に切り替えました。突然、クラス継承はもう働きません。
私はクラスTheSuperclass
とTheSubclass : TheSuperclass
を持っています。テストを簡単にするために、私は実際にこのように作成しました。
// TheSuperclass.h
@interface TheSuperclass : NSObject {
}
// subclasses must override this method
- (id)returnSomethingUseful;
@end
// TheSuperclass.m
#import "TheSuperclass.h"
@implementation TheSuperclass
- (id)returnSomethingUseful {
NSLog(@"Dude, you have to override -returnSomethingUseful");
return nil; // subclasses override this method!
}
- (id)init {
if ((self = [super init])) {
obj = [self returnSomethingUseful]; // TEST
NSLog(@"TheSuperclass initialized: %@", obj);
}
return self;
}
@end
// TheSubclass.h
#import "TheSuperclass.h"
@interface TheSubclass : TheSuperclass {
}
@end
// TheSubclass.h
#import "TheSubclass.h"
- (id)returnSomethingUseful {
NSLog(@"Correct method called!");
return usefulObject;
}
TheSubclass *foo = [[TheSubclass alloc] init]; // remember: init of superclass calls the method
// Getting the NSLog: "Dude, you have to override -returnSomethingUseful"
id bar = [foo returnSomethingUseful]; // now call it directly on foo
// Getting the NSLog: "Correct method called!"
:あなたがここに見ることができるものよりも多くのコードはありません
は、つまり、テンプレートメソッドを宣言だけで、何もしないnilを返し、サブクラス化のために意図されているメソッド:
- (id)returnSomethingUseful {
NSLog(@"Dude, you have to override -returnSomethingUseful");
return nil; // subclasses override this method!
}
TheSubclass
では、私は単純にそのテンプレートメソッドをオーバーライドします。もちろん、私はTheSuperclass
の実装をコピーして100%正しくしました。タイプミスはありません。それは確認された事実です。 TheSuperclass
の実装では
- (id)returnSomethingUseful {
NSLog(@"Correct method called!");
return usefulObject;
}
コードの一部は、テンプレートメソッドからそのオブジェクトを取得するために[self returnSomethingUseful]
を呼び出します。このようになります。それは素晴らしいパターンであり、私はそれをたくさん使ってきました。それは常にこのように正確に働いた。
しかし、私はTheSubclass
のインスタンスを作成しても、常にWRONGメソッドを呼び出すように見えます。 TheSuperclassのものではなく、TheSuperclassからのものです(これはもちろん超過方法です)
私はそれを少なくとも100回チェックしました!真剣に、それはTheSubclass
のインスタンスです。それは私にNSLogsを与えるTheSuperclass
のinitメソッドを呼び出します。
今は本当に奇妙な部分:
TheSubclass *foo = [[TheSubclass alloc] init];
id bar = [foo returnSomethingUseful];
// Getting the NSLog: "Correct method called!"
をので、それを強調するために:私はそれが動作しますが、「外部から」私のTheSubclassオブジェクトにそのメソッドを呼び出して、私はTheSuperclassの実装内から[self returnSomethingUseful]
を呼び出すと、
これを回避するにはどうすればよいのでしょうか?これはランタイムで問題になるのですか?これは、おそらくコンパイラのエラーによって引き起こされるでしょうか?
きれいにして再構築しますか?コンパイラがアップグレードから二日酔いを取得している可能性があります。 NSLogの代わりにブレークポイントを使用することを検討してください。 – BoltClock
私は1つ設定するたびに私がお金を稼ぐように使用されるブレークポイント。それは、必要なときに優先メソッドにジャンプしません。 – dontWatchMyProfile
"これはWRONGの実装を呼び出します"これは、あなたが '+ [TheSubclass init]'の実装を示すべき理由です。実際に、TheSubclassのインスタンスではありません。 – Caleb