Objective-C学习笔记2

来源:互联网 发布:淘宝旅行网日本签证 编辑:程序博客网 时间:2024/05/16 16:07
1,[class new]和[[class alloc]init]:
这两种初始化方式基本没有区别,只不过后者显示地调用init方法来初始化,也可以将init换成其他的方法,比如NSString中的initWithFormat。
以下是new的定义:
  1. + new{id newObject = (*_alloc)((Class)self, 0);Class metaClass = self->isa;if (class_getVersion(metaClass) > 1)    return [newObject init];else    return newObject;}
    + alloc{return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); }
    - init{    return self;}
具体参照:http://blog.csdn.net/newjerryj/article/details/8561717


2,自动释放池 autorelease pool
当调用autorelease方法时,就会把当前的对象放到释放池中,等到释放池被销毁的时候,就会把池中的对象一起销毁。其实就相当于把对象看成普通变量一样,系统会在特定时机(池子销毁时)释放对象(参照C++中的堆和栈)。但是要注意的是,其实所谓的释放其实就是对对象做了一次release操作(count减一),如果你在释放之前对其进行retain操作而没有release的话,池子释放的时候计数值仍然不为0,那么对象还是不会被释放。
关于autorelease对象的释放时机,可以看看P142“清理自动释放池”里的内容。


3,ARC内存自动管理
新版Xcode已经将ARC作为默认配置,也就是不需要用户自己去管理内存。ARC的本质其实就是Xcode自动地给你添加了你本来需要手动编写的release和retain。
有了ARC之后是否可以抛弃autorelease?关于这个问题我现在仍然保留疑问,在百度上也没有找到很好的答案,总觉得既然ARC能智能地选择时机进行释放,那么就可以不需要autoreleasepool了。也许ARC还不够智能?
P134“访问方法中的保留和释放”一节中的代码值得好好看一下,在非ARC模式下,关于对象的赋值,最好是先对新对象进行retain然后再release旧对象(注意顺序),能够避免对象泄露或者被意外销毁。

4,弱引用和强引用P146
首先要知道这两种方式只在ARC下存在。
当所有的强引用被解除时,对象会被系统释放,即使仍然有弱引用指向它。
从这句话我们可以猜测,强引用其实就是系统在对象引用时做了一次retain,而弱引用则没有。当强引用解除的时候做一次release操作。
但当对象被释放的时候如果还有弱引用指向这个对象就会出现问题,所以系统默认会把弱引用设置为零,所以_weak又叫归零弱引用。而又另一种弱引用在对象释放时不归零,由于容易出现问题,所以叫_unsafe_unretained。


5,不支持ARC的指针(bridge转换)
首先3个关键字(__bridge,__bridge_transfer, __bridge_retain)仅在ARC模式下存在。
P153中提到只有可保留对象指针(ROP)能使用ARC,对于这个ROP我在网上没有找到相关的信息,这里只需记住Objective-C对象支持ARC,而CoreFoundation对象(一般都比较底层的)不支持ARC。不支持ARC的对象需要使用CFRelease进行手动释放,而如果要使它支持ARC就需要对其进行转换。
(1)__bridge:
仅仅是做了类型转换,可以在OC和CF类型之间互换。比如:
        NSString *OC=[[NSString alloc]init];
         CFString *CF=(__bridge CFString*)OC;
  这里仅仅只是对OC进行了类型转换以便于赋值给CF,OC所指向的内存还是由ARC管理,系统会自动release,不需要手动去进行CFRelease(CF),有点类似于前面提到的弱引用。而相反的,如果是从CF转换为OC则需要在结束时手动CFRelease,如下:
       CFStringRef *CF= CFStringCreate();
           NSString *OC=(__bridge NSString*) CF;
      ...
       CFRelease(CF);
  (2)__bridge__transfer:
       用于CF对象转换成OC对象时,除了进行类型转换之外,还将CF对象的控制权转交给OC(ARC)。
        CFStringRef *CF= CFStringCreate();
    NSString *OC=(__bridge_transfer NSString*) CF;
        这里将不需要再对CF对象进行CFRelease()操作,因为已经将控制权交给OC,ARC会在合适的时机对它进行Release。我们可以理解为除了类型转换之外,还做了:
     [OC retain];
     CFRelease(CF);
       (3)__bridge__retained:
       与__bridge_transfer相反,常用在将OC对象转换成CF对象时,将OC对象的所有权交给CF对象来管理。d

        NSString *OC=[[NSString alloc]init];
          CFString *CF=(__bridge_retained CFString*)OC;
           ...
          CFRelease(CF);
     结束的时候需要手动去调用CFRelease(),可以理解为除了类型转换之外还做了:
     CFRetain(CF);
       [OC release];

具体参考:http://www.cnblogs.com/zzltjnh/p/3885012.html
           http://www.it165.net/pro/html/201503/36455.html
              
  





0 0
原创粉丝点击