我正在使用最新的SDK开发iOS应用程序。
我的应用程序是来自Android应用程序的端口,我有以下两种方法:
- (MyObject*)getMyObject:(MyObjectType)myObjectType
{
@synchronized(self)
{
for (int index = 0; index < [myObjects count]; index++)
{
MyObject* myObject = (MyObject*)[myObjects objectAtIndex:index];
if (myObject.Type == myObjectType)
return myObject;
}
return nil;
}
}
- (BOOL)isMyObjectVisible:(MyObjectType)myObjectType
{
@synchronized(self)
{
return ([self getMyObject:myObjectType] != nil);
}
}
我有isMyObjectVisible:
,即@synchronized
,正在调用另一个@synchronized
方法。
isMyObjectVisible:
是否必须@synchronized
?
答案 0 :(得分:1)
要回答您的第一个问题,否,则不需要双重锁定。
您可以锁定getMyObject
。这可以保护它。但是,isMyObjectVisible
除了调用getMyObject
之外没有任何内容,因此在该方法中没有任何 else 可以保护。
然而,borrrden的评论在这里不是问题。您在recursive lock时获得using @synchronized,因此您可以像没有死锁一样嵌套synchronized
次呼叫。在你的情况下,没有需要。
答案 1 :(得分:1)
以下是您需要使用double @synchronized:
的示例NSString * str;
str = [[NSString alloc] initWithFormat:@"str"];
-(void)viewDidLoad{
NSString *foo = @"foo";
NSString *bar = @"bar";
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self firstAction:foo];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self secondAction:bar];
});
}
- (void)firstAction:(NSString *)sender {
NSLog(@"firstAction");
@synchronized (self) {
str = sender;
for (int i=0; i<5; i++) {
NSLog(@"first: %@",str);
}
}
}
- (void)secondAction:(NSString *)sender {
NSLog(@"secondAction");
@synchronized (self) {
str = sender;
for (int i=0; i<5; i++) {
NSLog(@"second: %@",str);
}
}
}
(str是静态变量) - 尝试在没有@synchronized(self)的情况下运行它,看看会发生什么。