初到新公司,所以这两天就一直在看代码,今天在众多的知识点中有两个让我印象最深刻的,一个是NSClassFromString,一个是GCD多线程。
NSClassFromString
这个其实之前就看到过,但是一直没有深入到去了解,今天在公司的代码里看到了这个,所以就稍微深入的了解了一下。
首先他的好处有:
1、弱化连接,因此并不会把没有的Framework也link到程序中。
2、不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。
我的理解是,通过NSClassFromString可以检测某个类是否存在,是否可以创建其对象。
例如,正常来说,id myObj = [[NSClassFromString(@"MyClass") alloc] init];和
id myObj = [[MyClass alloc] init];是一样的,但是如果MyClass不存在的话,第二种方法就会报错,而第一种方法会返回一个nil。所以,为了防止工程中报错,我们可以这样写:if(NSClassFromString(MyClass)){id myObj = [[MyClass alloc] init];}
所以这个方法还是十分有用以及好用的。
GCD:
在任何一个项目中,肯定都会有线程,比如现在都已经封装好的第三方数据请求、现在经常使用的block等。GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
dispatch queue分为下面三种:
又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
它是全局可用的serial queue,它是在应用程序主线程上执行任务的。
在项目中最常用的就是dispatch_async,子线程处理耗时的操作,主线程用来更新UI。如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
以上都是简单的一些用法,还没有深入,等再深入了解之后再继续补充更新。