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和其子类

  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6554673.html
Copyright © 2011-2022 走看看