配列がどのように作成されるかを正確に確認したいと思います。それがどのように行われたかを示す.mファイルを表示するにはどうすればよいですか?
4 に答える
@Kenが述べたように、ソースは表示されません(ただし、gdbを介してメソッドを逆アセンブルできます)。
メソッド自体は、指定された配列の不変(変更不可)の自動解放されたコピーを作成します。以下は動作が同じです。
// Both resulting arrays are immutable and won't be retained
NSArray* immutableArray = [[[NSArray alloc] initWithArray:mutableArray] autorelease];
NSArray* immutableArray = [NSArray arrayWithArray:mutableArray];
NSArray* immutableArray = [[mutableArray copy] autorelease];
簡潔さに基づいて、好きなものを選んでください:-)。
+arrayWithArray
(自動リリースラッパーである以外に)目的が何であるかを尋ねている場合は-initWithArray
、これだと思います。配列の自動リリースされたコピーを作成する場合に使用します。言い換えれば、あなたはそれを次のように見ることができます:
NSArray * original = /* ... */;
NSArray * newArray = [NSArray arrayWithArray:original];
と同等です:
NSArray * original = /* ... */;
NSArray * newArray = [[original copy] autorelease];
あなたのスタイルに合うときに使うのに便利なところにあると思います。
いいえ、Cocoaはオープンソースではありません。
質問がある場合は、質問するだけです。
これは、それを実装するための1つの有効な方法です。
+ (id)arrayWithArray:(NSArray *)array {
return [[[self alloc] initWithArray:array] autorelease];
}
NSArrayのGNUStepソースを読むことができますが、これはCocoaAPIの代替実装であることに注意してください。
CocoaとCocoaTouchの子孫であるOPENSTEP仕様のGNU実装であるGNUstepは、次のように実装+arrayWithArray:
します。
/**
* Returns a new autoreleased NSArray instance containing all the objects from
* array, in the same order as the original.
*/
+ (id) arrayWithArray: (NSArray*)array
{
id o;
o = [self allocWithZone: NSDefaultMallocZone()];
o = [o initWithArray: array];
return AUTORELEASE(o);
}
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSArray.m?view=markup