20

最近、私は配列をよく使っていますが、疑問に思っています..これらの2つの行の違いは何ですか。

NSArray *array = [NSArray arrayWithArray:someArray];

NSArray *array = [someArray copy];

どちらが速いですか?と がある場合はどうNSMutableArrayなりmutableCopyますか?

4

7 に答える 7

24

どちらが速いですか?

ご心配なく。時期尚早の最適化。

主な違い: 最初のアプローチでは、2 行目で作成されたオブジェクトを所有しているのに対し、所有していないため解放する必要のない自動解放された「コピー」が生成されます。ちなみに、両方の配列は不変です。

于 2013-02-13T08:52:18.710 に答える
21

他の回答に加えて、someArraynilの場合、最初の行はarray空の配列を指し、2行目はnilを指します。これは、特に可変配列では重要な違いかもしれません。

于 2013-02-13T09:35:17.317 に答える
4

主な違いは、-copyそれ自体をコピーする方法をよりよく知っていることです (より効率的に行うことができ、おそらく NSArray のより適応したサブクラスを使用+arrayWithArray:できNSArrayます)。最初のオブジェクトと同じオブジェクトのリストを使用します。また、余分な自動解放を追加します。

その-copyため、(非常に)おそらくより効率的です。

実際、 immutableNSArrays-copyを実行しているだけな-retainので、新しいインスタンスを作成する必要さえありません。

于 2013-02-13T09:00:45.630 に答える
1

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のみ)

于 2016-01-25T23:47:42.893 に答える
1

そのうちの 1 つはおそらく高速です。それらを百万回実行して、誰かが勝つかどうかを確認してください。

NSArrayvsの場合、NSMutableArrayコピーされる不変配列は変更できないため、実際にコピーを返す必要はありません。ただし、変更可能な配列がある場合は、元の配列を変更できるため、コピーする必要があります。もちろん、変更可能なコピーを行うには、常に新しいオブジェクトを返す必要があります。

アプリ全体では、速度とメモリの違いは、他のすべての処理に比べれば問題にならないでしょう。

于 2013-02-13T08:52:00.600 に答える