zoukankan      html  css  js  c++  java
  • retain assign copy (unsigned long)

    unsigned long是无符号  计数器大于等于0;

    assign:   简单赋值, 不更改索引计数。 基本数据类型 (主要是提供访问的,引用的变量不能给它赋值)

    retain (OC对象)对其他NSObject和其子类, retain是说明该属性在赋值的时候, 先release旧值, 然后retain新值, 引用计数器再加1。

    copy:    指定应该使用对象的副本(深度复制), copy没有增加引用计数, 是分配一块新的内存来放置它, copy是创建一个新对象, retain是创建一个指针, 引用对象计数加1。 (主要是用于NSString的)

     

    例如:  NSString *str = [[NSString alloc] initWithString:@"aaa"];

    执行两个动作:

    1>在堆上分配一段内存用来存储@"aaa", 比如:内存地址为: 0x0012内容为"aaa";

    2>在栈上分配一段内存用来存储str, 比如:地址为0xaaaa 内容为0x0012;

     

    assign的情况:NSString *newStr = [str assign];  

    此时newStrstr完全相同地址都是0xaaaa, 内容为0x0012, 即newStr只是str的别名, 对任何一个操作就等于对另一个操作。因此计数器retaincount不需要增加1;

     

    retain的情况:NSString *newStr = [str retain];

    此时newStr地址不再是0xaaaa, 可能为0xbbbb, 但内容依然为0x0012,  retain是创建一个指针, newStr只是str都可以管理"aaa"所在的内存。因此计数器retaincount需要增加1;

     

    copy的情况:NSString *newStr = [str copy];

    此时会在堆上重新开辟一段内存存放@"aaa" copy是创建一个新对象(newStr),比如0x0013内容为@"aaa", 同时会在栈上为newStr分配空间 比如地址0xcccc内容为0x0013。因此计数器retaincount增加1newStr来管理0x0013这段内存;

    readwrite:  产生setter\getter。
    readonly:   只产生简单的getter,没有setter。
    assign:       默认类型,setter方法直接赋值,而不进行retain操作。
    retain:       setter方法release旧值,再retain新值。
    copy:         setter方法release旧值,再copy新值。

  • 相关阅读:
    绘图QPainter-画刷
    绘图QPainter-画笔
    pyqt5-多线程QThread类
    升级时出现错误的解决办法
    打包pyinstaller
    多文档界面QMdiArea
    停靠窗口QDockWidget
    堆叠窗口QStackedWidget
    VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
    【一】ODB
  • 原文地址:https://www.cnblogs.com/wangshengl9263/p/3072166.html
Copyright © 2011-2022 走看看