2011-07-05 6 views
9

私は再読み込みUIApplicationMainドキュメントだったと疑問に思い、UIApplicationMainは決して戻らない場合は、理由:iOS main.mテンプレートにreturn文と自動解放プールが含まれているのはなぜですか?

  • が最後にreturnありますか?
  • NSAutoreleasePoolですか?

私も自分自身に尋ねる:iPhone上の理由int main(int argc, char *argv[])? コマンドラインでアプリを起動できますか? argcargvは何ですか?彼らは使用されているのですか?

  • returnはコンパイラ
  • NSAutoreleasePoolは無用であるためにここにある:名誉の仲間からTwitterで

    いくつかのコメントがあることです。

  • 実行ループは、自動解放プールを割り当てる必要コンパイラは、関数が返すことはできませんことを知らないので、

答えて

4

1)return文がちょうどそこにおそらくある(#2矛盾)(そうではありません結局のところ、特別な方法でマークアップされています)。したがって、コンパイラのコードフロー分析では、return文が見つからないことが警告されます。それでもUIApplicationMain()に戻り値がある理由は説明されていません。実際にはが可能なエラー状況があるかもしれません。リターン、誰が知っていますか。プールなし解放任意のオブジェクトは、アプリケーションの全期間にわたって持続し、この自動解放プール、で終わるだろうと私はUIApplicationMain周りのメイン()で自動解放プールを持つと思う

2)は、間違っています。だから効果的にオブジェクトはまだ漏れています。

通常、自動解放プールがない場合、ランタイムは不足しているプールに関するエラーメッセージを記録し、_NSAutoreleaseNoPoolにブレークポイントを設定してプールレスの自動解放がどこで発生するかを検出するように指示します。したがって、テンプレート内に見つかったトップレベルのNSAutoreleasePoolは、実際にはで、ユーザからのこのリークはです。

UIApplicationMain()は、必要に応じて独自の自動解放プールを構築する必要があります(イベントプールを使用してプールを作成してください。誰かが実際にUIApplicationMain()を呼び出す前にObjCコードを実行する必要があると思っている場合(そしてapplicationDidFinishLaunchingなどで同じ作業を行うことはできません)、 UIApplicationMain()の前にいつでもプールを作成できます。 UIApplicationMain()は(exit()のように)決して戻らないように文書化されているので、それに続くコマンドを持つことには意味がありません。プールは決して解放されないだろう。

Macテンプレートを見ると、実際にプールがありません。

3)Mac上でアプリケーションをダブルクリックしても、パラメータが使用されます。 OSは特定の情報をアプリケーションにそのまま渡します。最初のパラメータは、起動時の実行ファイルへのパスです。バンドル内のファイルを見つけるために必要です。Finderから起動するとMacでは、PSN(プロセスシリアル番号)もパラメータとしてアプリケーションに渡されます:引数部分に

05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 0: /Volumes/RamDisk/MacTestApp-fdcuwfrzopalmgaufwujijhqhvjc/Build/Products/Debug/MacTestApp.app/Contents/MacOS/MacTestApp 
05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 1: -psn_0_2220574 
+0

Macテンプレートに関しては、ガベージコレクション(参照カウントされていない環境)を使用している可能性がありますか? iOSでは、それを持っていません。 –

+1

@Cyril Godefroyは怠惰な開発者だけがガベージコレクションを使用し、デフォルトでは有効になっていません。私はそれが嫌いですが、それは私の意見です。 –

+0

プレリリースソフトウェアにアクセスできる場合は、その質問に自分で回答することができます。私はもっ​​と言うことはできません。 – uliwitness

0

、iOSでは、あなたが直接アプリを起動場合にのみ取得しますあなたは、他の情報は、同じメカニズムで処理する必要があり、ファイルを開くのUIApplicationデリゲートメソッドからのURLなどを読み取ることができることを考える一つの引数、アプリケーションのパス

2011-07-05 22:38:15.004 iCyril[2326:707] There are 1 args 
Argument 1 : /var/mobile/Applications/7D58CC99-89C3-4F86-93D9-5FAF0756B706/iCyril.app/iCyril 

+0

おそらくありません。これにより、すでに実行中のアプリケーションでドキュメントまたはURLを開くことが不可能になります。 MacOSでは、Apple Eventsはファイル/ URLを開くようアプリケーションに指示するために使用されます。これらは今度はボンネットの下のマッハのメッセージに基づいています。私は、iOSが内部的に何か同等のものを持っていると推測します。 – uliwitness

関連する問題