在ios开发中大家用到更多的集合类可能是像NSSet或者NSDictionary,NSArray这样的。这里要介绍的是更少人使用的两个类,一个是NSMapTable,另一个是NSHashTable。
使用LLDB远程调试APP
NSHashTable & NSMapTable
小心NSAssert
今天在看Facebook的KVOController源码的时候,里面除了使用 NSAssert以外 还使用了 NSCAssert这个更少人用的。 就想起了之前遇到的一个由它引发的问题,顺便记录回忆下。
Ios 中内存释放顺序
今天的工作中遇到一个bug(非ARC),就是访问了一个被释放的对象。我找了好久查看是否被意外release之类的原因,都没有找到结果。后来我突然想到了一个点,是否是对象释放的顺序造成的。
我的程序中大概是这样的,viewcontroller的view中添加了一个tableview,然后tableview包含了一些subview。
我猜测是因为tableview持有那些subview的引用计数,那么如果我先释放tableview的话,tableview对subview的引用也就随之消失,那么就可能导致subview被提前释放,但是这个时候原本指向subview的那些指针并没有被置为nil,还是指向原来的地址,那么这个时候再进行release就会crash。
后来为了证明我得猜测,我修改了release的顺序,这个时候就没有再crash了。
另外[super dealloc]一定要写在最后,有点晚了,原因自己google吧,哈哈~~
20140317
ios随笔
最近的项目没有使用ARC,周末闲下来用检测了一下memory leak,发现有好些粗心犯的错误。
简单的回一下,ios中以 + alloc/new/copy/mutableCopy开头的方法返回的对象将被调用者持有, 意味着你需要对他进行release。
另外,比如[NSArray array]等类似的方法返回的对象是一个autorelease的,有可能你的程序不会crash,但是你需要retain这个对象,以保证它不会被清除掉了。
最近比较忙,抽空看了一下ReactiveCocoa,这是一个函数式编程的framework,让你以一种与以往不同的方式书写代码,这里有很好的入门文章,传送门在此。
#iOS# Block为什么不能捕获C语言数组的值
众所周知,在iOS的block中,我们可以截获自动变量,但是为什么如下截获C语言数组的代码却不行:
[译]NSNotificationCenter With Block Considered Harmful
本文是这篇原文的翻译,初次翻译,水平有限,望指正,同时也请尊重本人的劳动成果,转载请注明出处。
(注:有些地方翻译的感觉不好,贴上了原文。)
在过去,我们想要注册接受一个notification通常使用如下的方法:
-[NSNotificationCenter addObserver:selector:name:object:]
换句话说,就是target-action模式。当收到notification的时候,就会调用相应的selector。
Mach-O Excutables
当我们使用xcode开发程序的时候,源文件(.h .m)会被编译成可执行文件。那么这一切到底是怎样发生的呢?下面来简单说明。
GCD(Grand Central Dispatch)
什么是GCD
Grand Central Dispatch是异步执行任务的技术之一。开发者只需要定义想执行的任务追加到Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。