NSCookies

提供一些OC与Swift开发的小技巧,让大家可以花几分钟学到一些好玩的东西

链式编程(Method chaining)

所谓的链式编程呢,就是像链子一样一环扣一环,在编程中的体现呢,就是一个方法接着一个方法的调用。如果你还不懂那就想想Masonry,make.width.greaterThanOrEqualTo(@200);类似这种代码。这样就懂了吧,我的小乖乖~ 记得以前学Java的时候最喜欢这种不断点方法调用了,以前一直在想如果在OC中要实现链式编程的话会是怎么样子的呢?嗯~大概应该是这样的吧: // str是一个NSString [[str substringFromIndex:10] substringToIndex:12]; 想到这个我真的是日了🐶了,要让我不断用空格来调用,OMG,算了吧。知道后来Block的出现,我看到了曙光,因为我看到了Block竟然可以用()来调用Block,终于又看到了我可爱的()了。 但是接下来我还是一步一步的来看看如何做。那么我们假设我们现在要在OC中实现链式编程,那么最直接的做法就是在方法调用后直接返回对应的对象即可,那么假设我们有一个NSCStudent对象,他有study和play的方法,如果按照OC的方法来进行链式的话,应该就是这样[[student study] play], 那么NSCStudent的方法实现大概应该是这样: @implementation NSCStudent - (instancetype)study { NSLog(…

阅读全文

#pragma与 // MARK:

我去,就这两个东西还要讲?是OC或Swift开发人员都知道是怎么回事好吗?不就是用来标记和分组代码的吗?难道还有别的装逼技能? 当然,其实问大部分人说这两个是什么作用,或者是除了这两个还知道什么的情况下。很多人都只知道这两个是用来组织代码的。然而这样说也对也不对,确实我们常用的情况是都是用这两个来组织代码的,但是如果看过很多开源的人肯定看过一下的形式的代码: #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" .... //一些代码 #pragma clang diagnostic pop 那么这些代码是拿来干嘛的呢?且听我慢慢道来。 确实在我们日常工作中,经常用到#pragma mark或者// MARK:来组织代码,并且大家都知道组织代码有两种形式: 一种是用来分组,一种是用来标注。具体如何展示大家也当我废话,看下下面的代码吧: // Objective-C 代码 - (void)viewDidLoad { [super viewDidLoad]; [self initAll]; } #pragma mark…

阅读全文

字面量(Literal)

所谓的字面量就是其本身就涵盖自己本身的值以及能包含自己的类型的值,比如我们常见的有数字,字符串以及布尔值,就像下面这些: // Objective-C NSString *aString = @"Hello"; NSNumber *aNumber = @5; BOOL aBool = YES; NSArray *arr = @[@"Hello", @"World"]; NSDictionary *dic = @{@"key1": @"value1", @"key2": @"value2"}; // Swift let aString = "World" let aNumber = 6 let aBool = false let arr = ["Hello", "World"] let dic = ["key1": "value1", "key2": "value2"] 字面量在我们工作中几乎是无处不在,然而其实Objective-C与Swift中这两个的区别还是挺大的。Objective-C几乎不可以自定义字面量转换成类型,毕竟OC中的字面量转换成类型是在Clang中进行支持的。而在Swift中是通过一些列的字面量转换协议(Literal…

阅读全文

isa-swizzling?什么鬼?

刚看到这个名字估计很多人有点熟悉,Method Swizzling对不对,不熟悉也没关系,去看看之前的一篇文章黑魔法之Method Swizzling吧。不过也可以根据名称猜测出来所谓的isa-swizzling就是讲isa进行替换了的技术。如果有小伙伴问我什么是isa的话,不好意思,保安,有人来捣乱,拖出去~(开玩笑,关于什么是isa的话,大家可以去看看网络上很多关于OC的对象模型的文章)。 那么,既然是isa替换,那主角当然就是isa啦。那么这个技术出现在什么场景呢?其实这个技术在官方文档中关于KVO的文档中有提到过, 里面说到了,KVO是通过isa-swizzling来实现的。 Automatic key-value observing is implemented using a technique called isa-swizzling. The isa pointer, as the name suggests, points to the object's class which maintains a dispatch table. This…

阅读全文

黑魔法之Method Swizzling

背景:一手抓住女神,一首抓住楼主 “移形换影大法” 几秒钟后... “讨厌,死相,这什么武功嘛,好厉害的呢,好厉害的呢!” “pia~,赶紧说正题”(一脱鞋过来!) 咳咳,其实今天要说的这个,估计很多童鞋看到这个名字就知道是什么了。对了,这个就是大家最最熟悉的黑魔法之一。(其实也就是前面开头中用到的那个移形换影大法,人家没有不正经,只是举了个例子而已啦~嗲~)我们常说OC的动态性是OC的一大特点之一,其中非常好的一个例子就是这个Method Swizzling,用得好它能做出非常恶心的功能————如果Xcode很多插件。但是如果滥用的话,它也会造成非常大的麻烦————最明显的就是很多程序中莫名其妙的bug。 但是作为最为流行的黑魔法我们要知道,如果有童鞋做安全,逆向或者hack别人App,那估计这个是基础的基础了吧。并且很多开源库中都用了这个“魔法”,所以知道这个还是非常有必要的。 我们知道OC底层的实现中,对象的实现方法都存在类中,存在一个叫做objc_method_list,而这里真正存储的是一个关于函数名、参数列表以及函数实现的指针的dispatch table。而其实真正的Method Swizzling的实现就是一个替换函数指针的过程。 怎么个替换方法呢?其实也非常简单, 看下下面两幅图就知道里面是怎么实现的了。…

阅读全文