0

私のプロジェクトが後者を使用している間に、サンプルコードでこの最初の main.m を使用するクラスがあるため、少し混乱しています。applicationDidFinishLaunching を使用してクラスをインスタンス化するのに非常に苦労しています。これらの異なる main.m ファイルが原因である可能性があります。私のプロジェクトとサンプル プロジェクトの間の .xib ファイルは、メイン Nib 名の .plist 設定と同じです。デリゲートはすべて正しくリンクされています

#import <UIKit/UIKit.h>
#import "MidiTestingAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MidiTestingAppDelegate class]));
    }
}

#import <UIKit/UIKit.h>

int main(int argc, char *argv[])
{
#if __has_feature(objc_arc)
    @autoreleasepool
    {
        int retVal = UIApplicationMain(argc, argv, nil, nil);
        return retVal;
    }
#else
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
#endif
}

前者はApp Delegateに直接行き、後者はUIApplicationを直接ロードすると思いますか? あれは正しいですか?

4

2 に答える 2

4

ここには悪い情報がたくさんあります。

まず、Xcode の最新バージョンを持っていると仮定すると、必要なのは最初のバージョンだけです。

この@autoreleasepool構文、非 ARC プロジェクトで機能します。コンパイラはそれをすべて把握し、どちらの場合でも適切なコードを生成します。

コードの 2 番目の部分では、機能検出マクロ ( ) を使用して、ARC が有効かどうかに応じて、プールを作成する__has_feature新しい@autoreleasepool構文と従来の方法のどちらを使用するかを決定します。NSAutoreleasePool新しい構文が利用できない古いバージョンの Xcode を実行している場合にのみ、2 番目のコードを使用する必要があります。

于 2012-06-08T14:11:15.677 に答える
0

2 番目の例は悪いフォームです。これは、@autoreleasepoolARC 以外のプロジェクトで使用でき、実際には独自のプールを作成するよりも高速 (リンク) であるためです。

于 2012-06-08T14:11:10.513 に答える