2017-05-03 7 views
-3

私は現在cocoapodライブラリを作成中です。 json、pngなどのxibファイルをロードする場合は、メインバンドルを使用する代わりに[NSBundle bundleForClass:[self class]]]を使用する必要があります。私は知りたかったのですが、このようにするにはこの推奨方法があり、その意味は何ですか?[NSBundle bundleForClass:[self class]]]それはどういう意味ですか?

+1

コードが現在の実行可能ファイル(Test、Framework)にない場合は、このコードを使用してください。 – shallowThought

答えて

2

Appleは、バンドルを使用して、アプリケーション、フレームワーク、プラグイン、その他多くの特定の種類のコンテンツを表現します。バンドルは、含まれているリソースを明確に定義されたサブディレクトリに編成し、バンドル構造はプラットフォームとバンドルのタイプによって異なります。

-[NSBundle bundleForClass:]は、指定されたクラスのバンドルを提供します。例えば

AwesomeApp: 
AppController 
FrameworkA: 
    FrameController 

AwesomeApp.appバンドルを返すのAppController -[NSBundle bundleForClass:[self class]]に呼び出します。そしてFrameController内ではFrameworkA.framework返します -

1

バンドルを カプセル化コードとリソースに使用されているのMacOSとiOSの基本的な技術です。バンドルは、必要なリソースの既知の場所を提供することによって開発者 の経験を簡素化し、複合バイナリファイルを作成する必要性を軽減する を簡略化します。代わりに、バンドル は、より自然なタイプの 組織を提供するためにディレクトリとファイルを使用します。 の開発中と配備後の両方で簡単に変更することもできます。

xCodeプロジェクトには、複数のターゲットが含まれることがあります。複数のターゲットには、異なるファイル(アセットファイルやソース/設定など)が含まれている場合があります。

この方法では、すべてのファイルをすべてのターゲットにパックする必要はありませんが、区別することができます。 特定のテストファイル/リソース/ "無効な"ファイルを提供してコードをテストすることができるので、特にこれをテストするのは素晴らしいアプローチです。 mainBundle(基本的には提供されるアプリケーション)にあるタイムコードのほとんどをテストしますが、アプリケーション内でパケットではないアセットやその他のものも使用するためです。

この機能を利用したい場合は、別のバンドルから特定のファイルをロードすることをお勧めします。

だから、あなたは文句を言わない

[[NSBundle mainBundle] pathForResource:@"tests" ofType:@"plist"] 

使用することができる。しかし、あなたのテストバンドルにごIN XCTTestCaseクラスを使用します:あなたが本当に知りたい場合は

// https://developer.apple.com/reference/foundation/bundle 
[[NSBundle bundleForClass:self.class] pathForResource:@"tests" ofType:@"plist"] 

https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html

バンドルの詳細については、次のリンクをご覧ください。 https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html#//apple_ref/doc/uid/10000123i

非常に強力で便利なので、時間を取ってください:-)

関連する問題