iOS开发中的线程安全

时间:2011-04-26 07:25:41

标签: multithreading ios uikit thread-safety

从维基百科有关thread-safety的说明中,线程安全代码可以在多线程中运行。

对于iOS 3.x,UIKit不是线程安全的,因为4.0,UIKIt是线程安全的。

在我们的实现中,我们可以使用synchronized来构建线程安全代码。我对线程安全的疑问是:

1)。如何使用仪器工具或其他方式检测线程安全编码问题? 2)。为iOS开发编写线程安全代码的任何好的做法?

2 个答案:

答案 0 :(得分:5)

  

从4.0开始,UIKIt就是线程安全。

基本上,UIKit不是线程安全的。自4.0以来,只有绘制到UIKit中的图形上下文是线程安全的。

1)嗯,我也想知道: - )

2)Concurrency Programming Guide怎么样?

答案 1 :(得分:1)

要使非线程安全对象线程安全,请考虑使用代理(请参阅下面的代码)。在解析后台线程中的数据时,我将它用于NSDateFormatter,它不是一个线程安全的类。

/**
 @brief
 Proxy that delegates all messages to the specified object
 */
@interface BMProxy : NSProxy {
    NSObject *object;
    BOOL threadSafe;
}

@property(atomic, assign) BOOL threadSafe;

- (id)initWithObject:(NSObject *)theObject;
- (id)initWithObject:(NSObject *)theObject threadSafe:(BOOL)threadSafe;

@end

@implementation BMProxy

@synthesize threadSafe;

- (id)initWithObject:(NSObject *)theObject {
    object = [theObject retain];
    return self;
}

- (id)initWithObject:(NSObject *)theObject threadSafe:(BOOL)b {
    if ((self = [self initWithObject:theObject])) {
        self.threadSafe = b;
    }
    return self;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [object methodSignatureForSelector:aSelector];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    if (self.threadSafe) {
        @synchronized(object) {
            [anInvocation setTarget:object];
            [anInvocation invoke];
        }
    } else {
        [anInvocation setTarget:object];
        [anInvocation invoke];
    }
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    BOOL responds = [super respondsToSelector:aSelector];
    if (!responds) {
        responds = [object respondsToSelector:aSelector];
    }
    return responds;
}

- (void)dealloc {
    [object release];
    [super dealloc];
}

@end