この投稿リンクからの参照 NSMutableDictionary を使用して必要な情報を保存するという同じ概念を使用して、同様のカテゴリを実装しました。しかし、元の投稿で私を混乱させることが1つあります
- (NSMutableDictionary *)addl_associatedDictionary
{
NSMutableDictionary *res = nil;
@synchronized(self)
{
if (!(res = [self addl_associatedDictionaryPrimitive]))
{
res = [self addl_generateAssociatedDictionary];
}
}
return res;
}
@synchronized キーワードが mutilthread の保護であることは知っています。しかし、他の例を見ていくと、ほとんどは保護を使用しませんでした。それで、保護は必要ですか?また、静的dispatch_once_tを使用して@synchronizedを置き換えることはできますか? 以下は.mファイルの私のコードスニップです
@dynamic associatedDict;
-(void)setAssociateValue:(NSMutableDictionary*)dict
{
objc_setAssociatedObject(self, @selector(associatedDict), dict, OBJC_ASSOCIATION_RETAIN);
}
-(id)getAssociateValue
{
return objc_getAssociatedObject(self, @selector(associatedDict));
}
-(NSMutableDictionary*)associatedDict
{
NSMutableDictionary* dict=[self getAssociateValue];
if(!dict)
{
dict=[[NSMutableDictionary alloc]init];
[self setAssociatedDict:dict];
}
return dict;
}
-(void)setAssociateDict:(NSMutableDictionary *)associatedDict
{
[self setAssociatedDict:associatedDict];
}
-(id)associate_getObjectForKey:(NSString*)key
{
return self.associatedDict[key];
}
-(void)associate_setObject:(id)obj forKey:(NSString*)key
{
[self.associatedDict setObject:obj forKey:key];
}