4

ココアのデザインパターンのため、のインスタンスメソッドの名前countNSMutableArrayあいまいです。保存された変数countを返すか、呼び出されるたびに配列内の項目をカウントして、それを返すことができます(cocoaは、変数の値を返すだけのメソッドは、ではなく、であるfooことを示します)。Objective Cは、メソッドが呼び出されるたびに実際にアイテムをカウントしますか、それとも事前に計算された変数の値を返しますか?これがJavaの場合、ソースコードを調べますが、のソースコードが見つかりません。私はAPIを見ました、そしてそれが言ったのはこれだけでした:foogetFooNSMutableArraycountNSMutableArray

現在配列内にあるオブジェクトの数を返します。

コンテキストがなかったので、それが内部で計算を行うことを意味するかどうかはわかりません。

4

2 に答える 2

7

あなたが正しく指摘したように、それが何らかの方法で動作するという保証はありません。

ただし、実際に-[NSArray count]は一定時間の操作です。これは、小さな配列と大きな配列を作成し、それらのカウントを取得するのにかかる時間をベンチマークすることで、自分で確認できます。countこのように、コア配列クラスにO(n) メソッドを使用するのは非常にばかげています。

于 2013-01-31T23:50:01.797 に答える
5

NSArray_used配列のカウントを保持しているように見えるプライベート ivar を宣言します。を使用object_getInstanceVariable()すると、具象サブクラスの場合、__NSArrayMオブジェクトが追加および削除されると、この変数が増減することを確認できます。

これを確認するために、Mac OS X Foundation コマンドライン ツールである次のプログラムを使用しました。

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSMutableArray *anArray = [NSMutableArray array];
        NSLog(@"anArray's concrete class is %@", [anArray class]);
        UInt64 used = 0;
        for (NSString *toAdd in @[@"o", @"m", @"g"]) {
            object_getInstanceVariable(anArray, "_used", (void **)&used);
            NSLog(@"array = %@, used = %lld", anArray, used);
            [anArray addObject:toAdd];
        }
        for (NSString *toRemove in [anArray copy]) {
            object_getInstanceVariable(anArray, "_used", (void **)&used);
            NSLog(@"array = %@, used = %lld", anArray, used);
            [anArray removeObject:toRemove];
        }
        object_getInstanceVariable(anArray, "_used", (void **)&used);
        NSLog(@"array = %@, used = %lld", anArray, used);
    }
    return 0;
}

このプログラムは、次の出力を生成しました。

2013-01-31 17:40:15.376 Array[10173:303] anArray's concrete class is __NSArrayM
2013-01-31 17:40:15.378 Array[10173:303] array = (
), used = 0
2013-01-31 17:40:15.378 Array[10173:303] array = (
    o
), used = 1
2013-01-31 17:40:15.379 Array[10173:303] array = (
    o,
    m
), used = 2
2013-01-31 17:40:15.379 Array[10173:303] array = (
    o,
    m,
    g
), used = 3
2013-01-31 17:40:15.380 Array[10173:303] array = (
    m,
    g
), used = 2
2013-01-31 17:40:15.380 Array[10173:303] array = (
    g
), used = 1
2013-01-31 17:40:15.380 Array[10173:303] array = (
), used = 0
于 2013-02-01T00:43:22.893 に答える