NSCookies

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

历史冤案之isKindOfClass与isMemberOfClass

开封有个包青天,铁面无私辩忠奸。话说在那峨眉山上有个尼姑庵(诶,怎么串戏了)。咳咳,不好意思,忘记吃药了。进入今天的主题吧,为什么说历史冤案呢?其实也说不上怨,跟窦娥比起来,它还好得很呢。 其实这次跟大家讲的是很多人都知道的OC的对象模型,也就是下面这张图,大家先有个印象先: 然后我们看看它的“冤”在哪,先来看一段代码吧。 BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL res3 = [(id)[Pluto class] isKindOfClass:[Pluto class]]; BOOL res4 = [(id)[Pluto class] isMemberOfClass:…

阅读全文

Tagged Pointer

Tagged Pointer What the hell is this?冷静!冷静!不要激动,从名字来上看应该是一个“打标记"的指针?其实想想好像以前见过这个名字, 对以前一定看过这个。于是乎我有开始搜索大脑以及程序员的资源库——Google。 soga,原来是这个回事。好了,这节就到这里了。(赶紧说,别废话!)既然你诚心诚意的发问了,为了防止世界被破坏,为了维护世界的和平...&%%&^&&^$。谁用拖鞋扔我! 好吧,且听我静静装逼,不对,且听我慢慢说来。所谓的Tagged Pointer其实就是一个带着"真实"的数据信息的指针。说到底他也就是一个伪指针。为什么这么说呢? 我们来先看两个例子: NSNumber *num1 = [NSNumber numberWithInt:10]; NSNumber *num2 = [NSNumber…

阅读全文

可变参数(Variadic Arguments)

在OC中最常用的函数之一应该就是NSLog这个输出函数了,作为有好奇心的新青年,我“手贱”的点进了NSLog的声明里看到了下面的声明: FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 这个代码然我瞬间感觉好熟悉,想起了之前Java中的可变参数函数。可是再仔细一看就发现,尼玛后面的可变参数竟然是没有参数名,而且也没有类型之类的信息,瞬间我就懵逼了。 于是我就找了我的大哥--谷歌,经过一番查找之后发现其实也不是特别难。乍一看虽然跟Java中将参数默认识别为一个具体类型的数据完全不同,但是其实还是换汤不换药,其实只是我们将Java中帮我们做的那一份我们自己实现了而已。 其实说是OC的可变参数的实现不如说是C的可变参数的实现,因为OC是C的超集,而且在许多方面来说OC并没有完全的摆脱C的影子。好了不废话了,看招: // 可变参数的实现 -(NSNumber *)sumAllValues:(NSNumber *)initValue, ... { va_list args; // 1. va_start(args, initValue); // 2. NSNumber *arg = va_…

阅读全文