Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C运行时将对象与NSMutable字典关联_Ios_Objective C_Concurrency_Associated Object - Fatal编程技术网

Ios Objective-C运行时将对象与NSMutable字典关联

Ios Objective-C运行时将对象与NSMutable字典关联,ios,objective-c,concurrency,associated-object,Ios,Objective C,Concurrency,Associated Object,这篇文章的参考资料 我使用相同的概念实现了一个类似的类别,即使用NSMutableDictionary来存储我需要的信息。但有一件事让我在最初的帖子中感到困惑 - (NSMutableDictionary *)addl_associatedDictionary { NSMutableDictionary *res = nil; @synchronized(self) { if (!(res = [self addl_associatedDictio

这篇文章的参考资料 我使用相同的概念实现了一个类似的类别,即使用NSMutableDictionary来存储我需要的信息。但有一件事让我在最初的帖子中感到困惑

- (NSMutableDictionary *)addl_associatedDictionary
{
     NSMutableDictionary *res = nil;
     @synchronized(self) 
     {
        if (!(res = [self addl_associatedDictionaryPrimitive])) 
        {
           res = [self addl_generateAssociatedDictionary];
        }
     }
    return res;
}
我知道@synchronized关键字是对multilthread的保护。但当我浏览其他示例时,大多数都没有使用保护。那么,保护是否必要?我还可以使用静态分派一次性替换@synchronized吗?下面是我在.m文件中的代码snipptes

@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];
}

向后看,不,您不能简单地使用
dispatch\u once\t
来完成此特定任务。正确使用
dispatch\u once\t
需要一个全局变量,并且您的任务需要在每个对象实例中执行一次-即,您需要为每个实例使用唯一的全局变量

您需要
@synchronized
的保护吗?这是为了防止两个或多个线程同时创建字典。当然,如果在每个线程的第一次调用中没有它,根据时间的不同,每个线程可能返回不同的字典。在随后的调用中,每个调用都将返回由最后一个线程创建的字典,以对关联变量进行赋值,所有其他创建的字典都将丢失

重要
NSMutableDictionary
本身是非线程安全的。如果您确实有多个线程在读写字典,那么您需要额外的同步/锁定来避免问题。有多种方法可以做到这一点,只需搜索并找到适合您需要的解决方案。当然,如果您没有多个线程,那么这一切都是毫无意义的,
NSMutableDictionary
可以并且一直安全地使用,而不是线程安全的


HTH

向后看,不,您不能简单地使用
dispatch\u once\u t
执行此特定任务。正确使用
dispatch\u once\t
需要一个全局变量,并且您的任务需要在每个对象实例中执行一次-即,您需要为每个实例使用唯一的全局变量

您需要
@synchronized
的保护吗?这是为了防止两个或多个线程同时创建字典。当然,如果在每个线程的第一次调用中没有它,根据时间的不同,每个线程可能返回不同的字典。在随后的调用中,每个调用都将返回由最后一个线程创建的字典,以对关联变量进行赋值,所有其他创建的字典都将丢失

重要
NSMutableDictionary
本身是非线程安全的。如果您确实有多个线程在读写字典,那么您需要额外的同步/锁定来避免问题。有多种方法可以做到这一点,只需搜索并找到适合您需要的解决方案。当然,如果您没有多个线程,那么这一切都是毫无意义的,
NSMutableDictionary
可以并且一直安全地使用,而不是线程安全的


HTH

向后看,不,您不能简单地使用
dispatch\u once\u t
执行此特定任务。正确使用
dispatch\u once\t
需要一个全局变量,并且您的任务需要在每个对象实例中执行一次-即,您需要为每个实例使用唯一的全局变量

您需要
@synchronized
的保护吗?这是为了防止两个或多个线程同时创建字典。当然,如果在每个线程的第一次调用中没有它,根据时间的不同,每个线程可能返回不同的字典。在随后的调用中,每个调用都将返回由最后一个线程创建的字典,以对关联变量进行赋值,所有其他创建的字典都将丢失

重要
NSMutableDictionary
本身是非线程安全的。如果您确实有多个线程在读写字典,那么您需要额外的同步/锁定来避免问题。有多种方法可以做到这一点,只需搜索并找到适合您需要的解决方案。当然,如果您没有多个线程,那么这一切都是毫无意义的,
NSMutableDictionary
可以并且一直安全地使用,而不是线程安全的


HTH

向后看,不,您不能简单地使用
dispatch\u once\u t
执行此特定任务。正确使用
dispatch\u once\t
需要一个全局变量,并且您的任务需要在每个对象实例中执行一次-即,您需要为每个实例使用唯一的全局变量

您需要
@synchronized
的保护吗?这是为了防止两个或多个线程同时创建字典。当然,如果在每个线程的第一次调用中没有它,根据时间的不同,每个线程可能返回不同的字典。在随后的调用中,每个调用都将返回由最后一个线程创建的字典,以对关联变量进行赋值,所有其他创建的字典都将丢失

重要
NSMutableDictionary
本身是非线程安全的。如果您确实有多个线程在读写字典,那么您需要额外的同步/锁定来避免问题。有多种方法可以做到这一点,只需搜索并找到适合您需要的解决方案。当然,如果您没有多个线程,那么这一切都是毫无意义的,
NSMutableDictionary
可以并且一直安全地使用,而不是线程安全的


HTH

这可能有助于回答关于锁定成本的隐含担忧:我注意到您使用的是
OBJC\u关联\u保留
,而不是
OBJC\u关联\u保留
。考虑到你的
@synchronize
,这似乎是多余的,因为如果你有后者,你就可以放弃对前者的锁定。现在你要付两倍的同步费。要么付一次,要么根本不付

最好的总体解决方案可能是:

NSMutableDictionary *res; // no need to assign to `nil`; it's implied in ARC

// you're using an atomic property, so this is inherently safe
if (!(res = [self addl_associatedDictionaryPrimitive])) 
{
    // okay, doesn't exist, but two or more threads may get to
    // here simultaneously so we'll need to synchronise, and...
    @synchronized(self) 
    {
        // ... check again. As someone else may already have proceeded past the
        // outer if and created it while this thread was waiting to
        // enter the synchronised block. Assuming this dictionary
        // is created more rarely than it's accessed, this is no great issue
        if (!(res = [self addl_associatedDictionaryPrimitive])) 
        {
           res = [self addl_generateAssociatedDictionary];
        }
    }
}
return res;
。。。并坚持使用
OBJC\u ASSOCIATION\u RETAIN