由于项目中经常需要程序绘制各种奇形怪状的自定义控件,所以NSBezierPath是一个非常不错的选择,偶然的机会发现当设置NSBezierPath的lineWidth为1.0时,绘制出来的效果很不理想,如下图所示:
MAC系统状态栏通过插件添加图标MenuExtra Plugin
在开发MAC软件时,为是让用户更方便的使用功能并且不占用过多桌面空间,我们一般都会选择在状态栏添加图标,就如Windows上的任务栏一样.我们通常使用如下的方式的生成状态栏图标:
|
|
对替身(Alias)文件的操作
对于替身文件的操作,以前我们可以直接使用CarbonCore/Aliases.h这个头里面的方法,比如FSIsAliasFile,FSResolveAlias,FSNewAliasFromPath等方法来判定是否是替身文件,找到替身的原文件和创建替身,但这些方法在10.8系统上都已经DEPRECATED,所以目前最好都使用更高级的API来对替身操作.在更高级的API中我们就会发现,原来Alias会被用在Bookmark之中,所以通过对NSURL中Bookmark相关的方法就可以方便的处理替身文件了,以下就是对应上文中的FS中的三个方法新的实现:
线程安全的可变容器类
稍稍有点儿Objective-C编程经验的人都明白NSMutableArray和NSMutableDictionary此类可变的容器都是线程不安全的。但即便大家都知晓这个准则,但在使用多线程编程时,我们仍然会通过可变容器来达到线程间的数据共享,当然作为富有经验的程序员,你肯定会想法设法让这种不安全变得安全,比如用锁、或者将容器的操作切换到同一个线程或串行的dispatch_queue中。但有时原本很简单的逻辑却因为这严谨的安全让这一切变得复杂起来,这时我便希望有一个安全的容器类让代码显得更加优雅。
通过ServiceManagement注册LaunchdDaemon
在OSX开发与系统密切相关的软件,经常会使用到高权限的操作,让整个程序都以高权限执行显然是不合适的,通过将高权限的任务封装到独立的子程序,按需要进行调用是比较合理的做法。而常见的做法是通过注册LaunchdDaemon,便可轻松实现开机启动、长驻后台、高权限的需求。
迟来的2013年终总结
2013年眼看都过去好多天了,看着大家都在写年终总结了,但因为最近工作实在太忙,加上家里有个熊孩子,所以一直抽不开身来总结我的2013。
2013是一个成长年,更是忙碌的一年,不仅对我而言是这样,对我整个家庭来说也是如此,但我为所经历的这一切感到幸运、充实和满足。
JavaScript与Objective-C之间的通信
之前自己闲着无聊写过几个套用网页的“皮包软件”,其实像这样的“皮包软件”也可以做得很高端大气的,通过WebKit实现的OC-JS Bridge,可以非常方便的实现在JS中调用OC的方法/在OC中调用JS的方法。如此一来,便可以通过web实现炫丽的UI,而通过原生API实现与本地相关的操作。
修改其它程序的defaults文件
在iOS和Mac开发的程序中,我们常用NSUserDefaults来保存一些配置信息,我们都知道这是一种基于Plist文件的存储,并且最终保存的信息存放在/Library/Preferences/或~/Library/Preferences/目录之下,以BundleID命名的plist之中。
快速计算目录的size
关于目录的size计算,我尝试过很多种方式去实现过,虽然都已经应用在正式的项目之中,但我一直对其性能不满意。最常见的就是通过递归方式去逐层计算,但通过测试发现在计算层数多、数量大的目录时,递归的方式会消耗很大的栈空间,甚至出现栈溢出,当然效率也会是很大的瓶颈。最初通过将NSFileManager获取单个文件size修改为FS的函数提升效率,到后来改用效率更高的stat方式,并且不仅可能获得文件实际大小,也能获得占用磁盘的大小。另外通过自己实现栈的方式去替换掉递归,不仅节省了内存占用,让效率也有大幅的提升。
在Mac OSX中获取网卡MAC地址
今天在CocoaChina上看到有人发帖在询问如何在Mac OSX下获得网卡的物理地址,恰好最近在学习IOKit的一些知识,所以通过IOKit的接口肯定是可以很方便的拿到MAC地址信息的,但不知道还有没有其它更方便的API了,所以我姑且贴出一段通过IOKit去获得网卡MAC地址的代码: