2

次の方法が、別のスレッドによってロックされている可能性のあるオブジェクトを読み取ってコピーするための最良の方法であるかどうか疑問に思っていましたか?

-(NSObject*) getCopyOfActiveObjectsOfType:(Class) objectClass
{
    NSMutableArray* copy = [NSMutableArray arrayWithArray:[self.activeObjects objectForKey:objectClass]];

    return copy;
}

問題のオブジェクトをロックして、オブジェクトを配列に追加または削除する次のようないくつかのメソッドがあります。

-(void) addObject:(NSObject *)object toPoolOfObjects:(NSMutableDictionary*) objects
{
    Class objectClass = [object class];
    @synchronized (objects)
    {
        NSMutableArray* objectArray = [objects objectForKey:objectClass];

        if(objectArray == nil)
        {
            objectArray = [[[NSMutableArray alloc] init] autorelease];
            [objects setObject:objectArray forKey:objectClass];
        }
        [objectArray addObject:object];
    }

}
4

1 に答える 1

0

@synchronize別の言語でメソッドまたは同等の方法を使用する:

  • インスタンスが複数のスレッドからアクセスされ、それが不変でない場合、変更可能な状態にアクセスするすべてのメソッドの周りに同期ブロックが必要になります。
    • アクセサー/メソッドのいずれもオブジェクトの内部状態を変更しない場合、オブジェクトは不変です。

状態に標準の NSMutableArray / NSMutableDictionary プリミティブを使用していますが、これらはスレッドセーフではないため、スレッド間で共有する場合はロックが必要です。API とそのコンシューマーのアクセスと更新頻度を知らなければ、特定のソリューションを推奨することは困難です。

API のほとんどが読み取りである場合は、コピー オン ライトを実装する次のソリューションで問題を解決できます。ただし、いつものように、ソリューションがパフォーマンス要件を満たしているかどうかを判断するには、プロファイルを作成する必要があります。

- (NSArray *)getActiveObjectsOfType:(Class)objectClass {
    @synchronize(self.activeObjects) {
        return [self.activeObjects objectForKey:objectClass];
    }
}

- (void)addObject:(NSObject *)object {
    Class objectClass = [object class];

    // synchronize access to activeObjects
    @synchronize(self.activeObjects) {
        NSArray *existingArray = [[[self.activeObjects objectForKey:objectClass] retain] autorelease];

        NSMutableArray *newArray;
        if (existingArray) {
            newArray = [NSMutableArray arrayWithArray:existingArray];
        } else {
            newArray = [NSMutableArray array];
        }

        [newArray addObject:object];

        [self.activeObjects setObject:newArray forKey:objectClass];
    }
}

このソリューションで注意すべき重要なことは、getActiveObjectsOfType によって返される NSArray が不変であることです。

于 2011-11-15T17:39:51.930 に答える