関連するオブジェクトのセットがあり、それらに簡潔にアクセスできるよりも、それらを反復処理できることが重要である場合は、それらをコレクションに貼り付ける必要があります。
NSMutableDictionary *system_info = [NSMutableDictionary dictionary];
for (id key in @[@"domain", @"description", @"type"]) {
system_info[key] = [xmlObject alloc];
}
次に、代わりにsystem_dictionary
を使用しますsystem_info[@"dictionary"]
。(重要な場合は、KVCを使用して物事をより簡潔にすることもできます。)もちろん、それがユースケースに合わない場合は、そもそも辞書に貼り付けるのはばかげています。
他のユースケースでは、あなたが行ったことは、3つxmlObject
のsを宣言する通常の慣用的なObjectiveCの方法です。それを回避する方法があるかどうかを本当に知りたいのであれば、もちろんありますが、それらのほとんどはかなりばかげています。
より良い解決策は、言語を切り替えることかもしれません。Python、Ruby、Applescript、ObjC ++、eeroなどはすべて、ObjCと同じくらい簡単にObjCランタイムにアクセスでき、より簡潔な慣用的な方法で物事を行うことができます。たとえば、Pythonでは次のようになります。
system_domain = xmlObject.alloc()
system_description = xmlObject.alloc()
system_type = xmlObject.alloc()
あるいは:
system_domain, system_description, system_type = [xmlObject.alloc() for _ in range(3)]
これらを500個続けて初期化する必要がある場合のもう1つの妥当なオプションは、ObjCコードを生成する簡単なコードを作成することです。
しかし、本当にObjCにとどまりたいのであれば、ここにいくつかのばかげた解決策があります。
xmlObject
これを行うだけで、出現数を6から4に減らすことができます。
xmlObject *system_domain = [xmlObject alloc],
*system_description = [xmlObject alloc],
*system_type = [xmlObject alloc];
または3:
id system_domain = [xmlObject alloc];
id system_description = [xmlObject alloc];
id system_type = [xmlObject alloc];
または1に:
Class x = xmlObject;
id system_domain = [x alloc];
id system_description = [x alloc];
id system_type = [x alloc];
または:
id makeXmlObject() { return [xmlObject alloc]; }
...
id system_domain = makeXmlObject();
id system_description = makeXmlObject();
id system_type = makeXmlObject();
いくつかのサイドノート:
おそらく、の結果を使用したくないでしょう[xmlObject alloc]
。これは、を構築するのに十分なメモリのブロックでありxmlObject
、クラスに接続されてxmlObject
いますが、それ以外の場合は完全に初期化されていません。イニシャライザーを使用して何か便利なことを行う前に、イニシャライザー(通常-[init]
は、多くの場合は次のようなもの)を呼び出す必要があります。-[initWithValue: andOtherValue:]
したがって、ほとんどの慣用的なObjCコードは、次のような呼び出しでいっぱいになります。
Foo *foo = [[Foo alloc] init];
Bar *bar = [[Bar alloc] initWithFoo:foo];
また、ARC(またはGC)を使用している場合を除き、通常autorelease
、オブジェクトは初期化されたらすぐに使用する必要があります。それ以外の場合は、メモリを手動で管理する必要があります(10倍高速と言うのと同じくらい適切に行うのは困難です)。したがって、ARC以外のコードを処理する必要がある場合は、次のように表示されます。
Bar *bar = [[[Bar alloc] initWithFoo:foo] autorelease];
幸い、多くのクラスは、すべてを1つで実行するクラスコンストラクターを提供します。
NSString *s = [NSString stringWithUTF8String:c]; // ARC or no ARC
これらの便利なメソッドが存在する場合は使用する必要がありますが、必要になるため、alloc] init];
(およびalloc] init] autorelease];
、ARC / GC以前のコードを処理する必要がある場合は)イディオムに慣れてください。
ObjCランタイムバインディングを使用する他のすべての言語でも同じことが言えます。たとえば、Pythonでは、Bar.barWithFoo(foo)
可能な場合はそれを行います。それ以外の場合は行いBar.alloc().initWithFoo_(foo)
ます。
その間、あなたがこのようなことをすることができない理由:
xmlObject *system_domain, *system_description, *system_type = [xmlObject alloc];
…または…</p>
system_domain = system_description = system_type = [xmlObject alloc];
…これの唯一の合理的な解釈は、3つのオブジェクトすべてをの同じインスタンスに設定することですxmlObject
。一度だけ呼び出すとalloc
、1つだけが割り当てられます。
最後に、ObjCクラスに小文字の最初の文字で名前を付けるのは悪いスタイルと見なされます。それはそうあるべきですXMLObject
(あるいは多分XmlObject
、しかしAppleは頭字語と頭字語を明示的にするのが好きです)、ではありませんxmlObject
。また、非常に単純なプロジェクトを除いて、ほとんどの人は、さまざまなサブプロジェクトやサードパーティのライブラリなどからのクラスを区別できるように、すべてのクラスに2文字または3文字のプレフィックス(AppleのNSなど)を付けることを好みます。 、したがって、'ALIXMLObject`はさらに優れている可能性があります。