Потокобезопасен в разработке iOS - PullRequest
0 голосов
/ 26 апреля 2011

Из объяснения википедии о thread-safety , потоки-безопасные коды могут выполняться в многопоточности.

Для iOS 3.x, UIKit не является безопасностью потоков, поскольку 4.0 , UIKI является безопасностью потоков.

В наших реализациях мы можем использовать синхронизированные для создания кодов безопасности потоков. Мои вопросы о безопасности потоков:

1). Как обнаружить проблему кодирования безопасности потока с помощью инструментов инструментов или другими способами? 2). Есть ли хорошие практики для написания кодов безопасности потоков для разработки под iOS?

Ответы [ 2 ]

5 голосов
/ 26 апреля 2011

начиная с 4.0, UIKIt - это безопасность потоков.

По сути, UIKit не является потокобезопасным. Только рисование в графическом контексте в UIKit является поточно-ориентированным с 4.0.

1) Хм, я тоже хочу знать об этом: -)

2) Как насчет Руководство по программированию параллелизма ?

1 голос
/ 22 декабря 2012

Чтобы сделать потокобезопасный объект потокобезопасным, рассмотрите возможность использования прокси (см. Код ниже).Я использую его, например, для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...