SuperYang`s Blog

Coding Everything.

RunLoop深度探究(一)

RunLoop的概念

一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的:

1
2
3
4
5
6
7
function loop() {
    initialize();
    do {
        var message = get_next_message();
        process_message(message);
    } while (message != quit);
}

这种模型通常被称作 Event Loop。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop。实现这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。

宏定义的高级用法

1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如:

1
2
#define example(instr) printf("the input string is:\t%s\n",#instr)
#define example1(instr) #instr

当使用该宏定义时:

关于block使用的5点注意事项

1、在使用block前需要对block指针做判空处理。

不判空直接使用,一旦指针为空直接产生崩溃。

if (!self.isOnlyNet) {
    if (succBlock == NULL) { //后面使用block之前要先做判空处理
        return;
    }
    id data = [NSKeyedUnarchiver unarchiveObjectWithFile:[self favoriteFile]];
    if ([data isKindOfClass:[NSMutableArray class]]) {
        succBlock(data,YES);
    }else{
        succBlock(nil,YES);
    }
}

 

Objective-C错误模型

为什么不使用异常处理机制?

事实上,OC是具备异常处理机制的,但是具体情况下不会启用该机制。原因是ARC下默认不是“异常安全”的。 理由是,如果抛出异常,那么本应该在作用域末尾释放的对象在现在不能自动释放了。 如果想生成“异常安全”的代码,需要设置编译标志“-fobjc-arc-exceptions”,并且需要引入额外的代码,在不抛出异常时,也照样执行这段代码。 及时不适用ARC,也很难在抛出异常后不会导致内存泄露。例如:

1
2
3
4
5
6
id resource = [YCResource alloc] init] retain];
if (/*有异常发生*/) {
@throw [NSException exceptionWithName:@"/*异常名称*/" reason@"/*异常原因*/" userInfo:nil];
}
[resource callSomeMethod];
[resource release];   

为Harpy(版本更新工具)制做兼容版本

中文版:

Harpy (兼容版本)

github:https://github.com/yangchao0033/Harpy

(iOS5-9适配版本,基于ArtSabintsev/Harpy v3.4.5)

提醒用户你的应用有新的可用版本,并且及时的跳转到App Store进行更新。

关于

Harpy 将用户手机上已安装的iOS app版本与当前App Store最新可用版本进行检查对比。如果有新的可用版本时,使用弹窗及时提醒用户最新版本信息,并然用户选择是否需要进一步操作。

关于@autoreleasepool的性能测试及手动释放自动释放池

首先,我们先对使用autoreleasepool的场景进行性能对比。

  • 不用autoreleasepool
1
2
3
4
5
6
7
8
- (void)doSomething {
    NSMutableArray *collection = @[].mutableCopy;
    for (int i = 0; i < 10e6; ++i) {
        NSString *str = [NSString stringWithFormat:@"hi + %d", i];
        [collection addObject:str];
    }
    NSLog(@"finished!");
}

关于在storyboard中使用静态cell的注意事项

–关于在storyboard中使用静态TableViewCell的可变高度的使用技巧

起因:在storyboard使用之前,创建tableView视图,通常是采用代码控制数据源,通过数据源数据的长度来决定tableView中cell的个数,而这样做的好处还有就是可以通过将已经在界面中展示的cell放入缓存池中,以供后续数据展示再从缓存池中取出进行复用。这样做的好处是为了防止数据过大时创建大量的cell浪费不必要的空间。显而易见,tableView就是为了进行批量数据的展示。