相关疑难解决方法(0)

如何在Objective-C中锁定/解锁@synchronized?

@synchronized不使用"锁定"和"解锁"来实现互斥吗?那怎么做锁定/解锁呢?

以下程序的输出仅为"Hello World".

@interface MyLock: NSLock<NSLocking>
@end

@implementation MyLock

- (id)init {
    return [super init];
}

- (void)lock {
    NSLog(@"before lock");
    [super lock];
    NSLog(@"after lock");
}

- (void)unlock {
    NSLog(@"before unlock");
    [super unlock];
    NSLog(@"after unlock");
}

@end


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyLock *lock = [[MyLock new] autorelease];
    @synchronized(lock) {
        NSLog(@"Hello World");
    }

    [pool drain];
}
Run Code Online (Sandbox Code Playgroud)

synchronization objective-c

198
推荐指数
3
解决办法
18万
查看次数

帮助理解返回单例的类方法

有人可以帮我理解下面的方法是做什么的吗?

+ (Game *) shared
{
    static Game *sharedSingleton;

    @synchronized(self)
    {
        if (!sharedSingleton)
        {
            sharedSingleton = [[Game alloc] init];
        }
    }

    return sharedSingleton;
}
Run Code Online (Sandbox Code Playgroud)

singleton cocoa-touch objective-c singleton-methods ios

12
推荐指数
2
解决办法
6751
查看次数

单例或类方法

在阅读了对Objective C中关于单例的问题的回答之后,似乎每个解决方案都在实例访问器中对线程进行了一些权衡.即

@synchronized(self)
{
    if (sharedInstance == nil)
            sharedInstance = [[MySingleton alloc] init];
}
return sharedInstance;
Run Code Online (Sandbox Code Playgroud)

这基本上是单线程访问单例,如果它是在操作中经常使用的东西,看起来像是可能导致线程不必要地竞争的东西.

简单地使用类对象作为单例实例,并通过类方法公开功能,即

@interface MySingleton : NSObject {
}

+ (void)doSomething;
@end

@implementation MySingleton    
+ (void)initialize {
   //do some setup if necessary
}

+ (void)doSomething {
    //do something
}
@end
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我们避免每次想要引用单例对象时都进行锁定+检查,我们也可以省去将其存储在本地或方法ivar中.

此方法还允许运行时保证在任何给定时间系统中只存在一个实例(Class对象).

编辑

这里除了线程之外还有更多,使用传统的单例,您通常会编写如下代码:

MySingleton *instance = [MySingleton getSharedInstance];
NSObject *someResult = [instance getResult];
//or
if (instance.someProperty) {
  //do something
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你的单例是一个类实例,你基本上就不需要一直调用getSharedInstance.考虑以下代码:

NSObject *someResult = [MySingleton getResult];
//or
if ([MySingleton someProperty]) {
  //do …
Run Code Online (Sandbox Code Playgroud)

singleton objective-c

6
推荐指数
2
解决办法
4238
查看次数

如何处理多线程访问sqlite3没有dblocked错误

在我的应用程序中,后台sqlite线程正在运行...在后台线程中它从Web服务获取数据并将数据插入或更新到数据库中.如果用户从前台插入或删除数据,有时我会崩溃它显示"sqlite dblocked".但它不会返回sqlite busy错误.

我测试了线程安全模式

     NSLog(@" sqlite3_threadsafe() = %d", sqlite3_threadsafe());
Run Code Online (Sandbox Code Playgroud)

它显示线程安全是2.

我想检查是否有其他数据库正在写数据,如果db正在写数据..我想在上一个写任务完成后写数据.

如何处理这些情况..

sqlite multithreading ios

5
推荐指数
2
解决办法
8092
查看次数