0

これは奇妙なものです。私が自分のアプリケーションに取り組んでいるとき、この問題が発生したり、消えたりしました。今日、それは消えることを拒否しています。

私のアプリは、2 つのビュー コントローラーを使用して自動回転を処理します。Objective-C がクラスを見つけられないことがあります。たとえば、[OneViewController alloc] はクラッシュします。この状態をキャッチする関数を追加しましたが、自分のコードを 1 行実行する前に関数を呼び出しても、問題は解決しません。私はこれを、私が書いた悪いコードではないことを証明するために取っています。

universalGoodness が定数にならない理由を知っている人はいますか?

void verifyUniversalGoodness()
{
 id portrait_class, landscape_class;

 portrait_class = NSClassFromString(@"OneViewController");
 landscape_class = NSClassFromString(@"OtherViewController");
 NSLog(@"CHECKING GOODNESS: portrait %@, landscape %@", portrait_class, landscape_class);
 if (portrait_class == nil || landscape_class == nil)
  exit(0);
}

int main( int argc, char *argv[] )
{
    verifyUniversalGoodness();

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;

}

alloc の呼び出しを実行すると、スタック トレースは次のようになります。

#1  0x3356296c in _class_initialize ()
#2  0x33567dfe in prepareForMethodLookup ()
#3  0x33565168 in lookUpMethod ()
#4  0x33562914 in _class_lookupMethodAndLoadCache ()
#5  0x3356264a in objc_msgSend_uncached ()
#6  0x000de704 in -[MyAppDelegate finishStartup] (self=0x61c9a0, _cmd=0x303117) at /Users/michael.toy/PROJECT/MyAppDelegate.mm:180
#7  0x32b77904 in __NSFireDelayedPerform ()
#8  0x32c23d22 in CFRunLoopRunSpecific ()
#9  0x32c234e0 in CFRunLoopRunInMode ()
#10 0x30d620da in GSEventRunModal ()
#11 0x30d62186 in GSEventRun ()
#12 0x314d54c8 in -[UIApplication _run] ()
#13 0x314d39f2 in UIApplicationMain ()
#14 0x000e13a8 in main (argc=1, argv=0x2ffff5a8) at /Users/michael.toy/PROJECT/main.mm:38
4

3 に答える 3

1

ご回答ありがとうございます。それは私に問題を詳しく調べさせた。私が気にかけているクラスは1つのライブラリにあり、メインは別のライブラリにあり、両方のライブラリが私の最終的なバイナリにリンクされていることがわかりました。

リンクラインに-Wl、-ObjCを追加する必要がありましたが、これで問題が修正されたようで、universalGoodnessが復元されました。何がこれが必要とされた状態を引き起こしたのか私にはわかりませんが、私はビジネスに戻ってうれしいです。

于 2010-08-05T03:38:28.490 に答える
0

答えはわかりませんが、NSClassFromString() と NSBundle の文言の違いに驚かされました。-(Class)classNamed:(NSString *)className

「aClassName で指定されたクラス オブジェクト、またはその名前のクラスが現在ロードされていない場合は nil*。aClassName が nil の場合、nil を返します。」

「className の Class オブジェクトです。className がレシーバーに関連付けられたクラスの 1 つでない場合、またはクラスの実装を含む実行可能コードの読み込み中にエラーが発生した場合は、nil を返します。」

したがって、 NSClassFromString() は、実際にクラスをロードする順序を暗示しているようには見えません。

于 2010-08-05T02:46:58.890 に答える
-1

portrait_class/landscape_class Classオブジェクトではなく、オブジェクトである必要がありidます。

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

(それはobjc.hからです)

于 2010-08-05T03:14:58.167 に答える