最近、私は配列をよく使っていますが、疑問に思っています..これらの2つの行の違いは何ですか。
NSArray *array = [NSArray arrayWithArray:someArray];
と
NSArray *array = [someArray copy];
どちらが速いですか?と がある場合はどうNSMutableArray
なりmutableCopy
ますか?
最近、私は配列をよく使っていますが、疑問に思っています..これらの2つの行の違いは何ですか。
NSArray *array = [NSArray arrayWithArray:someArray];
と
NSArray *array = [someArray copy];
どちらが速いですか?と がある場合はどうNSMutableArray
なりmutableCopy
ますか?
どちらが速いですか?
ご心配なく。時期尚早の最適化。
主な違い: 最初のアプローチでは、2 行目で作成されたオブジェクトを所有しているのに対し、所有していないため解放する必要のない自動解放された「コピー」が生成されます。ちなみに、両方の配列は不変です。
他の回答に加えて、someArray
nilの場合、最初の行はarray
空の配列を指し、2行目はnilを指します。これは、特に可変配列では重要な違いかもしれません。
主な違いは、-copy
それ自体をコピーする方法をよりよく知っていることです (より効率的に行うことができ、おそらく NSArray のより適応したサブクラスを使用+arrayWithArray:
できNSArray
ます)。最初のオブジェクトと同じオブジェクトのリストを使用します。また、余分な自動解放を追加します。
その-copy
ため、(非常に)おそらくより効率的です。
実際、 immutableNSArrays
は-copy
を実行しているだけな-retain
ので、新しいインスタンスを作成する必要さえありません。
Swift では、大きく異なります。新しいオープンソース Foundation for Swift のおかげで、init(array:)
与えられた項目 (存在する場合) で新しい配列を作成するのに対し、copy()
単純に を返すことがわかっていますself
。
public override func copy() -> AnyObject {
return copyWithZone(nil)
}
public func copyWithZone(zone: NSZone) -> AnyObject {
return self
}
https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSArray.swift#L82
public convenience init(array: [AnyObject]) {
self.init(array: array, copyItems: false)
}
public convenience init(array: [AnyObject], copyItems: Bool) {
let optionalArray : [AnyObject?] =
copyItems ?
array.map { return Optional<AnyObject>(($0 as! NSObject).copy()) } :
array.map { return Optional<AnyObject>($0) }
// This would have been nice, but "initializer delegation cannot be nested in another expression"
// optionalArray.withUnsafeBufferPointer { ptr in
// self.init(objects: ptr.baseAddress, count: array.count)
// }
let cnt = array.count
let buffer = UnsafeMutablePointer<AnyObject?>.alloc(cnt)
buffer.initializeFrom(optionalArray)
self.init(objects: buffer, count: cnt)
buffer.destroy(cnt)
buffer.dealloc(cnt)
}
https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSArray.swift#L116
したがって、明らかに、のcopy()
方が高速です。これで、両方がどのように機能するかがわかります。(Swiftのみ)
そのうちの 1 つはおそらく高速です。それらを百万回実行して、誰かが勝つかどうかを確認してください。
NSArray
vsの場合、NSMutableArray
コピーされる不変配列は変更できないため、実際にコピーを返す必要はありません。ただし、変更可能な配列がある場合は、元の配列を変更できるため、コピーする必要があります。もちろん、変更可能なコピーを行うには、常に新しいオブジェクトを返す必要があります。
アプリ全体では、速度とメモリの違いは、他のすべての処理に比べれば問題にならないでしょう。