RSS

Monthly Archives: 七月 2012

解决SBJSON中存在的线程安全问题

iOS平台上的JSON库有很多,除了SBJSON(原JSON Framework),iOS5中系统提供了NSJSONSerialization,其他优秀的JSON库还有JSONKit,TouchJSON等。由于历史原因,我目前所在的项目使用SBJSON。

SBJSON中对SBJsonStreamParserState和SBJsonStreamWriterState使用了单例模式,代码如下:

#define SINGLETON \
+ (id)sharedInstance { \
    static id state = nil; \
    if (!state) state = [[self alloc] init]; \
    return state; \
}

这段代码显然不是线程安全的,所以可能出现创建多个实例,同时在ARC下,对state再次赋值,会release之前的state。

同时SBJsonStreamParser与SBJsonStreamWriter中state属性是unsafe_unretained的(如下):

@property (nonatomic, unsafe_unretained) SBJsonStreamParserState *state;

这就导致了state已经没有了strong的引用,会被系统回收。这时再向state发送消息的话,就会发生message send to dealloced object或者[Class] can not respond to selector [Selector]之类的错误,进而发生Crash。

解决上述问题最直接的方法就是将SINGLETON改为线程安全的(如下):

#define SINGLETON \
+ (id)sharedInstance { \
    static id state = nil; \
    static dispatch_once_t once = 0; \
    dispatch_once(&once, ^{state = [[self alloc] init];}); \
    return state; \
}

相关的代码改动请查阅github上的提交:
https://github.com/AlenZhou/json-framework/commit/64e112f6f6a057ebcd65d14ba7f26e52cfb269cc


 
添加留言

Posted by on 七月 30, 2012 in Objective-C

 

Tags: , , , ,

ifconifg: command not found的解决方案

经常想要查看IP或者网卡MAC地址的时候就会输入ifconfig,如果出现 ifconifg: command not found 的话,要怎么办呢。

那说明你当前的帐户没有管理权限(administrative privileges),可以尝试sudo,应该不在sudoers中。这个时候要么换用管理员帐户,要么给当前帐户授权。

 
添加留言

Posted by on 七月 12, 2012 in solutions

 

Tags: , , ,

Mac OS X中锁定屏幕的方法

想要关闭显示器而不让mac进入睡眠状态,请使用如下快捷键:

⌃ + ⇧ + ⏏ (control + shift + eject)

如果想要激活显示器时进行密码验证,需要在系统设置->安全隐私 中勾选 从睡眠和屏保返回时需要输入密码

话说之前我一直是直接盖上的,直接盖上相当于Sleep,快捷键是:

⌥ + ⌘ + ⏏ (option/alt + command + eject)

但是每次打开网络需要重连。

 
1 Comment

Posted by on 七月 9, 2012 in Mac OS

 

Tags: