有时我们需要在一个对象生命周期结束的时候触发一个操作,希望当该对象dealloc的时候调用一个外部指定的block.下面贴一段非常简单的代码实现.原理非常简单,通过一个category给外部暴露一个block注入的接口,内部将该block封装到一个寄生对象中(Parasite),该寄生对象在dealoc的时候触发block调用,所有的寄生对象通过runtime的AssociatedObject机制与宿主共存亡,从而达到监控宿主生命周期的目的.

注意事项

  • 在block中不要强引用对象,否则引用循环释放不了;
  • block触发的线程与对象释放时的线程一致,请注意后续操作的线程安全.
阅读全文 »

在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件中那些造成性能低下的”罪魁祸首”也是我们神圣的职责.

阅读全文 »

Protocol Buffer(简称Protobuf或PB)是由Google推出的一种数据交换格式,与传统的XML和JSON不同的是,它是一种二进制格式,免去了文本格式转换的各种困扰,并且转换效率也是非常快,由于它的跨平台、跨编程语言的特点,让它越来越普及,尤其是网络数据交换方面日趋成为一种主流.

阅读全文 »

多说也算是一款非常成功的产品,想当年社交化评论系统在国内刚刚兴起的时候,友言、灯鹭、畅言和多说厮杀在各个新闻或博客的评论区,好是一番繁荣的景象,后来多说凭借稳定的服务,多样化的插件,坐稳这块小众市场的第一把交椅,让我们一度认为这就是中国版的Disqus。

阅读全文 »

Widget是OSX操作系统中比较古老的一个元素,虽然在目前最新版本的OSX仍然得以保留,但不难发现Apple已经渐渐将它遗忘在一个角落,似乎给它判死刑只是一个迟早的问题。即便如此,在Dashboard中提供的那几个Widget仍然给我们使用Mac提供了很多便利。

阅读全文 »

我们开发中常会遇上将NSData转换为NSString,或通过NSJSONSerialization解析JSON的场景,一旦NSData中包含非法的UTF-8编码,那么结果将是返回nil,但这样的结果并不符合我们预期,因为可能这其中仅仅只是一个编码错误,我们更希望将错误编码丢弃或替换为错误字符.
在Google上找了一圈,有人也实现了这样的方法,但个人觉得写得不够严谨,容错性也不太好,索性自己写一个吧,严格按照RFC3629的标准.

阅读全文 »

最近和同事在开发过程中遇上一个很诡异的BUG,大致路径是这样的,从服务器返回的JSON字符串中获得一个NSNumber对象(保存着uint64_t值),然后通过SQLite保存在本地(此处采用了便捷的FMDB库),当再次从SQLite中读出数据时,却发现值发生了改变.

阅读全文 »

在iOS开发过程中,对单行文本的垂直居中似乎是一件非常easy的事情,直接用下面这段代码就可以完成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@interface XXView : UIView
@end

@implementation XXView

- (void)drawRect:(CGRect)rect
{
UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:13];
NSDictionary *attributes = @{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor]};
NSAttributedString *title = [[NSAttributedString alloc] initWithString:@"我是垂直居中的"
attributes:attributes];
[title drawAtPoint:CGPointMake(CGRectGetMidX(self.bounds)-title.size.width/2, CGRectGetMidY(self.bounds)-title.size.height/2)];
}

@end
阅读全文 »

其实一开始想要放弃WordPress我是拒绝的,因为,不能说你们都放弃了,我就马上要放弃,第一我要先尝试一下,因为我不愿意说放弃以后用上静态框架,博客就“Duang”一下,变得很快,很屌,这样路过的访客肯定会骂我,说根本就没有WordPress那么便捷,那么功能强大,那就证明我其实只是闲得蛋疼。后来我经过各种围观,发现确实有很多静态框架可以选择,如Jekyll,Octopress,Hexo等等,在一些开源社区也有很丰富的theme,plugin可供使用,然后就,Duang,真的放弃了……

阅读全文 »

在OSX中检测鼠标移入移出事件不是特别方便,并且使用起来也不少坑,其实我们大多时候要求都是非常简单,就是希望鼠标移入移也时能正确响应,并且最终都能成对的调用,但事实又如何呢?
先来看看要实现mouseEntered和mouseExited应该怎么怎么做,通过查看NSView的文档可以看到,如果需要需要这两个事件,我们需要创建一个trakingArea的东西,有两个API可供使用:

阅读全文 »