![](/img/trans.png)
[英]What is the best way to pass an object to another class in Objective-C?
[英]Best way to do a “dirty read” of an object that may be locked by another thread in objective-c
我想知道以下是否是读取和复制可能被另一个线程锁定的对象的最佳方法?
-(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];
}
}
使用@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是不可变的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.