2

反復の場合、かなりの量のループを作成する必要がある状況になりました。このループにはNSData、キーに関連付ける必要のあるオブジェクトがありました。これにより、単純なObjective-c_KeyValuePair_クラスを検索することになりましたが、見つからなかったため、自分で作成しました。NSMutableDictinoaryここで、キーと値を1つだけ保持するだけでメリットがあるかどうかを知りたいと思います。プロジェクト全体で両方を試した後、AppUI側とInstrumentsTimeProfilerで大きな違いはわかりません。

だから私の質問は:

  • 単一のkvpairクラスは、NSMutableDictionary
  • NSMutableDictデフォルトでは、より多くのスペースを割り当てますか?
  • 私が見逃した標準の単一キー値ペアクラスは実際にありますか

いくつかのコード:

for (int i = 0, count = [photoUrls count]; i < count; ++i) {
    // Example usage of the kvp class
    NSMutableDictionary *imageRequest = [[NSMutableDictionary alloc] init];
    JHKeyValuePair *kvPair = [[JHKeyValuePair alloc] initWithKey:@"DAILY" andValue:[NSNumber numberWithInt:i];
    [imageRequest setObject:self forKey:@"delegate"];
    [imageRequest setObject:kvPair forKey:@"userInfo"];
    [kvPair release];
    [imageRequest setObject:[dailySpecialData objectForKey:@"IMAGE_URL"] forKey:@"url"];
    [imageDownloader addDownloadRequestToQueue:imageRequest];
    [imageRequest release];
}

JHKeyValuePair.h

@interface JHKeyValuePair : NSObject {
    id key;
    id value;
}

@property (nonatomic, retain) id key;
@property (nonatomic, retain) id value;

- (id)initWithKey:(id)aKey andValue:(id)aValue;

@end

JHKeyValuePair.m

#import "JHKeyValuePair.h"

@implementation JHKeyValuePair

@synthesize key;
@synthesize value;

- (id)initWithKey:(id)aKey andValue:(id)aValue {
    if ((self = [super init])) {
        key   = [aKey retain];
        value = [aValue retain];
    }
    return self;
}

- (void)dealloc {
    [key release], key = nil;
    [value release], value = nil;
    [super dealloc];
}

- (id)copyWithZone:(NSZone *)zone {
    JHKeyValuePair *copy = [[JHKeyValuePair allocWithZone:zone] init];
    [copy setKey:self.key];
    [copy setValue:self.value];
    return copy;
}

- (BOOL)isEqual:(id)anObject {
    BOOL ret;
    if (self == anObject) {
        ret = YES;
    } else if (![anObject isKindOfClass:[JHKeyValuePair class]]) {
        ret = NO;
    } else {
        ret = [key isEqual:((JHKeyValuePair *)anObject).key] && [value isEqual:((JHKeyValuePair *)anObject).value];
    }
    return ret;
}

@end

編集して最初の説明を修正します。私は文の途中で脇道に追いやられて、それを終えるために二度と戻ってこなかったようです。

4

1 に答える 1

1

本当に速度を上げたい場合は、キー/値を設定するたびに不要なリリースを保持する必要があります。構造体といくつかの基本的な C コードを使用すると、もう少し速く何かを達成できますが、客観的な C の方法で行うことから得られる単純で一貫したメモリ管理が犠牲になります。

typedef struct {
    id key;
    id value;
} Pair;

BOOL isEqual(Pair a, Pair b); //...

// You will need to clean up after yourself though:
void PairRelease(Pair p) {
    [p.key release];
    [p.value release];
}
于 2011-09-27T12:47:05.153 に答える