zoukankan      html  css  js  c++  java
  • iOS对象属性详解

    oc对象的一些属性:
     
    retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained
     
    下面来分别讲讲各自的作用和区别:
     
    retain,计数器加1, (增加一个指向内存的指针) 对应release(计数器-1) setter 方法对参数进行 release 旧值再 retain 新值,所有实现都是这个顺序
     
    复制代码
    - (void)setBackView:(UIView *)backView {
     
        if (_backView != backView) {
     
            [_backView release];
     
            _backView = [backView retain];
        }
     
        return _backView;
    }
    复制代码
    copy, 拷贝,新开地址,内容拷贝, setter 方法进行 Copy 操作,与 retain 处理流程一样,先旧值 release ,再 Copy 出新的对象, retainCount 为 1 。这是为了减少对上下文的依赖而引入的机制。
     
    (提一点深拷贝shallow copy,浅拷贝deep copy) 
     
    这篇文章比较直观(http://blog.csdn.net/omegayy/article/details/7311839)
     
    官方文档(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html
     
    copy和mutableCopy调用后表现的行为到底是什么样完成取决于类本身NSCopying和NSMutableCopying协议是如何实现的。
     
     
     
    strong, 强引用,计数器加1,和retain一样(对应retain和copy)
     
    weak,弱引用
     
    复制代码
    strong 用来修饰强引用的属性;
     
    @property (strong) SomeClass * aObject; 
    对应原来的 
    @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; 
     
    weak 用来修饰弱引用的属性;
    @property (weak) SomeClass * aObject; 
    对应原来的 
    @property (assign) SomeClass * aObject; 
    复制代码
    __weak, __strong 用来修饰变量,此外还有 __unsafe_unretained, __autoreleasing 都是用来修饰变量的。
    __strong 是缺省的关键词。
    __weak 声明了一个可以自动 nil 化的弱引用。
    __unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
    __autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。
     
     
     
    strong和weak的区别
     
    (weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放  ,即使还有weak型指针指向它。
     
    一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
     
    可能有个例子形容是妥当的。
     
    想象我们的对象是一条狗,狗想要跑掉(被释放)。
     
    strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。
     
    weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
     
    只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
     
     
     
    assign,用于简单类型,计数器不加,直接赋值,一个指针,一块地址, setter 方法直接赋值,不进行任何 retain 操作,为了解决原类型与环循引用问题
     
    readonly,只读,只生成get方法,没有set方法
     
    readwrite,默认,可读写,set,get方法都会生成
     
    unsafe_unretained,类似weak,所谓的unSafe就是指会容易出现也指针的情况,慎用
     
    setter = xxxx,声明对象的set方法
     
    getter = xxxx, 声明对象的get方法
     
    nonatomic,非原子操作,系统不添加代码,运行速度相对快,但数据操作在多线程情况下相对不安全
     
    atomic,原子操作,编译时会增加很多加锁解锁代码,数据操作在多线程情况下相对安全
     
    * 使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)
    * 使用copy: 对NSString
    * 使用retain: 对其他NSObject和其子类
     
  • 相关阅读:
    2020.06.09——习题训练五
    2020.06.01——习题训练4
    2020-05-26 — 习题训练三
    2020-05-22 — 习题训练二-F
    Java笔记(22):IO流(04)
    Java笔记(21):IO流(03)
    Java笔记(20):IO流(02)
    Java笔记(19):IO流(01)
    Java笔记(18):集合框架(04)
    Java笔记(17):集合框架(03)
  • 原文地址:https://www.cnblogs.com/mafeng/p/5211185.html
Copyright © 2011-2022 走看看