转载请标明出处:

http://blog.csdn.net/xmxkf/article/details/51353580

本文出自:【openXu的博客】

参数类别 参数 说明
原子性 atomic 对属性加锁,多线程下线程安全,默认值
nonatomic 对属性不加锁,多线程下不安全,但速度快
读写属性 readwrite 生成getter、setter方法,默认值
readonly 只生成getter方法
set方法处理 assign 直接赋值,默认值
retain 先release原来的值,再retain新值(包括判断是否为同一个值)
copy 先release原来的值,再copy新值(包括判断是否为同一个值)

copy拷贝(复制)分类:

①、深拷贝(深复制):内容拷贝,会产生新对象

②、浅拷贝(浅复制):指针拷贝,不会产生新对象

至于copy某个对象是深拷贝还是浅拷贝,只需要遵循下面两个原则,然后推测即可。

copy语法的两个原则:

①、新指针和旧指针指向对象的内容要一样

②、修改新指针指向的对象不会影响旧指针指向的对象

修改旧指针指向的对象不会影响新指针指向的对象

比如:

#pragma mark NSString的mutableCopy  深拷贝
void stringMutableCopy(){
    // 不可变的字符串
    NSString *old = [[NSString alloc] initWithFormat:@"Jack"];
    // 拷贝产生了一个可变的字符串,为了修改新指针指向的对象不会影响旧指针指向的对象,所以必须生成一个新的对象(深拷贝)
    NSMutableString *new = [old mutableCopy];
    [new appendString:@" 1234"];
    NSLog(@"old=%@", old);
    NSLog(@"new=%@", new);
    [new release];
    [old release];
}

#pragma mark NSString的copy 浅拷贝(新旧指针指向的字符串都不能改变,所以没必要生成新的对象)
void stringCopy(){
    //不可变字符串
    NSString *old = [[NSString alloc] initWithFormat:@"Jack"];
    // 在这种情况(返回对象本身)下,相当于retain
    NSString *new = [old copy];

    NSLog(@"new-%d", [new retainCount]);
    NSLog(@"old-%d", [old retainCount]);
    NSLog(@"old=%p", old);
    NSLog(@"new=%p", new);

    NSLog(@"old=%@", old);
    NSLog(@"new=%@", new);

    //[old release];
    [new release];
    [old release];
}

在非ARC的情况下:

①、copy:release旧值,copy新值

②、assign:直接赋值

③、retain:release旧值,retain新值

在ARC的情况下:

①、copy:release旧值,copy新值

②、assign:用在基本数据类型上

③、strong:强引用,类似于retain

③、weak:类似于assign(用在对象身上)

使用retain后生成的set方法如下:

- (void)setName:(NSString *)name{
    if (_name != name)
    {
        [_name release];
        _name = [name copy];
    }
}

使用copy后生成的set方法如下:

- (void)setName:(NSString *)name{
    if (_name != name)
    {
        [_name release];
        _name = [name copy];
    }
}

总结:基本数据类型用assign,NSString用copy,ARC下如果需要得到对象的引用(引用计数器+1,宿主在,对象就不会被销毁)用strong,如果不需要则用weak。

@property的参数的更多相关文章

  1. Objective-C 【@property 的参数问题】

    ------------------------------------------- @property参数 总的来说,这是一种编译器的特性(在生成@property的时候为@property添加相 ...

  2. strong,weak, retain, assign的区别@property的参数

    strong,weak, retain, assign的区别@property的参数 先说经验 使用场合 copy:NSString,block, weak:UI控件,代理 strong:一般对象.自 ...

  3. objective-c在Xcode中@property相关参数的解释

    objective-c在其对象拥有成员变量时,我们为了保持代码的封装,会将成员变量设置为@protected,并为成员变量编写setter和getter方法. 如: @interface Person ...

  4. 五、@property的参数

    格式:@property(参数1,参数2)类型 名字: 参数可有可无 如:@property int age; @property (nonatomic,retain) UIButton* btn; ...

  5. property相关参数介绍

    1.copy 使用类型 :NSString,block 2.assign使用类型 :delegate,int,float,NSInteger,bool,枚举,结构体... 3.retain使用类型 : ...

  6. OC基础--内存管理中的@property关键字以及其参数

    在上一篇博客中整理的内存管理,管理类的代码量会感觉很大,而且如果对象多的话,感觉到代码有点冗余.下面就介绍Xcode中为我们自动生成内存管理代码的关键字@property 例如:在Person这个类中 ...

  7. @property在内存管理中的参数问题

    // // Created by wanghy on 15/8/14. // // /* retain : release旧值,retain新值(用于OC对象),要配合nonatomic使用. ass ...

  8. OC语法7——内存管理之@property参数

    @property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们 ...

  9. Zookeeper + Hadoop2.6 集群HA + spark1.6完整搭建与所有参数解析

    废话就不多说了,直接开始啦~ 安装环境变量: 使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装 yum install gcc yum install gcc-c+ ...

随机推荐

  1. 在Unity3D中利用 RenderTexture 实现游戏内截图

    using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; publ ...

  2. Android Studio安装、配置、第一个程序的那些坑

    最近在上Android课,老师布置了量大题难的作业,然而出师未捷身先死,还没看题目,就被Android Studio的安装和环境配置搞得要死要死的,网上的教程也多也杂,良莠不齐,在经历了5小时通过的搜 ...

  3. Python的hasattr() getattr() setattr() 函数使用方法详解 (转)

    来自:https://www.cnblogs.com/cenyu/p/5713686.html hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOO ...

  4. [HNOI 2004]树的计数

    Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...

  5. github常用命令

    全局配置 git config --global user.name "lewiscutey"git config --global user.email "lewisc ...

  6. 使用rsync在windows(服务端)与linux(客户端)之间同步

    说明: 1.cwRsyncServer服务端 系统:Windows7 IP地址:192.168.0.110 2.Rsync客户端 系统:CentOS 6.7 IP地址:192.168.0.141 实现 ...

  7. PTA 字符串关键字的散列映射(25 分)

    7-17 字符串关键字的散列映射(25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余 ...

  8. Missing URI template variable 'XXXX' for method parameter of type String

    原因:就是spring的controller上的@RequestMapping的实参和方法里面的形参名字不一致 方法:改成一样就可. ps.还能用绑定的方法,不建议,因为太麻烦了 @RequestMa ...

  9. 《Effective Java》 读书笔记(一)

    对象的创建与销毁 ITEM1 使用静态工厂方法代替构造函数 传统的新建一个对象的方法是通过构造函数: Foo foo =new Foo(); 一个类也可以提供一个静态方法产生一个对象: Boolean ...

  10. 读书笔记-《Maven实战》-2018/4/16

    第一章:Maven简介 1:Maven:Maven原本的单词意思为"知识的积累",谷歌翻译为"行家",而作为Apache的开源项目,Maven是一个主要服务于基 ...