随笔分类 - Objective-C
摘要:今天在看多线程同步时,突然想到了单例的同步问题。自从dispatch_once出现后,我们创建单例非常简单且安全:1 static dispatch_once_t pred;2 static SingleObject *sharedObject = nil;3 4 dispatch_once...
阅读全文
摘要:最近开是做新项目,准备尝试使用ARC,记录遇到的一些问题。ARC是编译器特性,所以要求Xcode的最低版本为4.2,iOS4以上(注意weak是ios4以上才有的,ios4中只能使用__unsafe_unretained)。ARC的规则:不能调用dealloc方法(可以重写,做一些清除操作,例如de...
阅读全文
摘要:Class1 typedef struct objc_class *Class; 1 struct objc_class { 2 Class isa OBJC_ISA_AVAILABILITY; 3 4 #if !__OBJC2__ 5 Class super_class ...
阅读全文
摘要:NSObject是一切OC类的基类,所以我们必须对NSObject所有的方法有一个清楚的认识。+ (void)load;当类或者分类被加入到runtime时,load方法会被调用,也就是说在main循环开始前load方法就已经被调用。(当类被加载到进程的address space时,runtime就...
阅读全文
摘要:1.对于autorelease的理解 Each thread in a Cocoa application maintains its own stack of autorelease pool blocks.(Advanced Memory Management Programming Guide:Using Autorelease Pool Blocks) 通过这句话,我们可以看出autorelease pool 是栈的形式,andautorelease pool blocks can be nested主线程中也有自己的autorelease pool,这又牵扯出run loop。实..
阅读全文
摘要:Block的好处,我总结了下主要有2点:1.用于回调特别方便,2.可以延长对象的作用区域。但是,Block的内存管理这个模块一直不是很清楚,这个周末好好的看了下Block的原理,有些许心得。为了性能,默认Block都是分配在stack上面的,所以它的作用区域就是当前函数。#include int main(){ int i = 1024; void (^blk)(void) = ^ { printf("%d\n", i); }; blk(); return 0;}在blk这个block里面是不能修改i的。Why?我们可以通过clang看看编译器处理后...
阅读全文
摘要:所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:对象a创建并引用到了对象b.对象b创建并引用到了对象c.对象c创建并引用到了对象b.这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。这种情况,必须打断循环引用,通过其他规则来维护引用关系。比如,我们常见的delegate往往是assign方式的属性而不是retain方式的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。如果一个UI
阅读全文
摘要:NSArray *allObject = [dictionary allValues]; [allObject makeObjectsPerformSelector:@selector(objSel)];
阅读全文
摘要:要点:retain使对象的引用计数+1,需要release在属性中retain,需要在dealloc中releasedelegate最好不要retain,以免循环引用注意:retain在属性中的用法,调用self.XX时系统默认步骤是先release就对象,再retain新对象正确的释放方法为使用是不需要释放,直接在dealloc里面释放,即使该属性没有alloc,也应该在dealloc里面释放,以免发生leaks
阅读全文
摘要:要点:self调用自己方法,super调用父类方法self是类,super是预编译指令【self class】和【super class】输出是一样的self和super底层实现原理:当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找,然后调用父类的这个方法。当使用 self 调用时,会使用 objc_msgSend 函数: id objc_msgSend(id theReceiver, SEL theSelector, ...)。第 一个参数是消息接收者,第二个参数是调用的具体类方法的 selector,
阅读全文

浙公网安备 33010602011771号