RSS

Category Archives: iOS&Mac OS&Objective-C

Mac OS X中以十六进制方式查看或编辑二进制文件

不需要安装其它专用的十六进制编辑器,系统内置软件即可支持。

方法1:Xcode
1. 使用Xcode打开需要查看或编辑的binary文件
2. command + 1打开Project Navigator
3. 右键文件名,选择Open As -> Hex
4. 查看/修改,保存。

方法2:vim
1. 打开Terminal,输入vim path_to_file.bin
2. :%!xxd
3. 查看/修改
4. :%!xxd -r
5. :wq 保存退出。

http://stackoverflow.com/questions/827326/whats-a-good-hex-editor-viewer-for-the-mac


 
添加留言

Posted by on 四月 28, 2016 in solutions, Xcode

 

Tags: , ,

Mac OS X下sed替换中输入tab字符

在Mac OS X下使用sed时,不支持用\t表示tab。

Google搜索到下面的解决方案:

http://stackoverflow.com/a/6363672

在要输入tab的地方先按Ctrl+v,然后再按tab键就可以了。

 
添加留言

Posted by on 八月 27, 2014 in Mac OS

 

Tags: ,

Mac OS X Terminal中移动光标到开头,行末和逐词移动

在Mac OS X下执行shell命令时难免需要更改靠近行首的部分。

移动到开头(行首):Ctrl + A

移动到结尾(行末):Ctrl + E

逐词移动:Ctrl + ⬅︎ 向左, Ctrl + ➡︎ 向右

 
添加留言

Posted by on 八月 4, 2014 in Mac OS

 

Tags: , , ,

iOS中使用代码模拟内存警告

做iOS开发在模拟器上可以通过 Hardware -> Simulate Memory Warning 模拟内存警告,当我们使用真机的时候,或者说想给测试的同事也提供这样功能的时候,那我们就需要写程序,通过代码来实现了。

代码很简单,就一行:

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

但是请注意,最好只在测试的时候使用,发布到App Store的时候不要将上面的代码编译进去,使用这种没有文档化的方法有可能导致审核不通过,或者根本无法上传。

 
添加留言

Posted by on 十一月 5, 2012 in iOS

 

Tags: , ,

Mac OS X中打zip包时去除所有隐藏文件

Mac OS X等类uinx系统中使用.(点)开头来表示隐藏文件,例如常见的.DS_Store .svn以及Eclipse使用的.project等文件或目录,有时我们打zip包的时候,希望去除所有的隐藏文件,那么可以采用下面的命令。

打包当前目录所有文件,并且不包含隐藏文件

zip ARCHIVENAME *  -x "\.*"

 

打包当前目录以及子目录所有文件,并且不包含隐藏文件

zip -r ARCHIVENAME * -x "*/\.*" -x "\.*"
 
添加留言

Posted by on 九月 16, 2012 in Mac OS

 

Tags: ,

解决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: , , , ,

Mac OS X中锁定屏幕的方法

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

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

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

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

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

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

 
1 Comment

Posted by on 七月 9, 2012 in Mac OS

 

Tags:

failed to send the qLaunchSuccess packet以及一切Xcode相关疑难杂症的解决方案

用Xcode做iOS或者Mac开发的时候是否经常碰到莫名其妙的错误?逐步尝试下列方案吧:

1. product -> clean,做一次全新的build

2. 重启调试的设备,iPhone,iPad,Mac等等,如果在模拟器上调试就完全退出模拟器,再运行

3. 完全退出Xcode再打开,一定要Quit Xcode

4. 清除Xcode收集的数据,可以参考Xcode4中代码补全(Code Completion)失效的解决方案

5. 重启系统

6. 放大招,重装Xcode,重装Mac OS X,Time Machine等等,总之能做的都做吧。记得先备份workspace,还是不行的话,就只能采取冰敷,水疗,离子烫,微波,油炸….-_-

其实,还可以给苹果技术支持打电话,预约零售店的天才吧,或者向达人求助。

 
1 Comment

Posted by on 六月 8, 2012 in Xcode

 

Tags:

Mac OS X如何在Finder中显示所有文件

Mac OS X中有两类隐藏文件,一种是以 . 开头的,另一种则是系统认为一般用户无需了解的文件,如/etc, /usr。

.开头的文件在Terminal中ls -a就可以显示

如果想要在Finder中显示所有文件,那么可以在Terminal中执行如下的命令:

defaults write com.apple.Finder AppleShowAllFiles YES
killall Finder

第一行表示修改配置,在Finder中显示所有文件。第二行表示结束所有Finder进程,让Finder重启。

 
添加留言

Posted by on 五月 25, 2012 in Mac OS

 

Tags: , ,

危险的dictionaryWithObjectsAndKeys

使用NSDictionary的时候,最常见的就是采用[dic dictionaryWithObjectsAndKeys:....,nil];初始化一个NSDictionary,但是这种用法也许会带来意想不到的问题。

比方说如下代码:

    NSString* string1 = nil;
    NSString* string2 = @"string2";
    NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:
                         string1, @"string1",
                         string2, @"string2",
                         @"string3", @"string3", nil];

string1为nil,不仅会使从dic中取string2时发现string2为nil,并且在取我们认为肯定不为nil的string3时,string3也为nil,这就有可能引发各种意外。

那么解决方案就是当object有可能为nil的时候,采用setObject:forKey:

    NSString* string1 = nil;
    NSString* string2 = @"string2";
    NSMutableDictionary* dic = [NSMutableDictionary dictionary];
    if (string1) {
        [dic setObject:string1 forKey:@"string1"];
    }
    if (string2) {
        [dic setObject:string2 forKey:@"string2"];
    }
    [dic setObject:@"string3" forKey:@"string3"];

当然还有更便捷的方法,使用setValue:forKey:

    NSString* string1 = nil;
    NSString* string2 = @"string2";
    NSMutableDictionary* dic = [NSMutableDictionary dictionary];
    [dic setValue:string1 forKey:@"string1"];
    [dic setValue:string2 forKey:@"string2"];
    [dic setValue:@"string3" forKey:@"string3"];

请注意,setValue:forKey:与setObject:forKey:不完全等同,最大的区别有两点:

1. setValue:forKey:只接受NSString*类型的key
2. setValue:forKey:当value为nil时,将调用removeObjectForKey:

 
添加留言

Posted by on 五月 21, 2012 in Objective-C

 

Tags: , , , ,