关键词assign、strong、copy、weak、unsafe_unretained

影响:

  • 是否开辟新的内存
  • 是否有引用计数增加

strong

指向并拥有该对象。其修饰的对象引用计数会 +1,该对象只要引用计数不为 0 就不会销毁,置为 nil 可以销毁它。
一般用于修饰对象类型、字符串、集合类的可变版本NSMutable

// .h 文件
@property (nonatomic, strong) NSMutableArray * nArr; // .m 文件
{
NSMutableArray * mArr = [[NSMutableArray alloc]
initWithObjects:@"a", @"b", @"c", nil]; self.nArr = mArr; // setter方法赋值时, 指针拷贝(浅拷贝) [mArr addObject:@"d"];
NSLog(@"%@ %p %p", self.nArr, self.nArr, mArr);
} //打印结果
2018-10-16 19:29:27.550029+0800 Demo[64192:936916] (
a,
b,
c,
d
) 0x60000005bc60 0x60000005bc60 // 地址相同

copy

调用该变量的setter进行赋值,会把对象(值)拷贝一份副本,再赋。两个指针指向不同的内存地址,持有两个不同的对象。另一个对象发生变化不影响本身。

一般NSString、NSArray、NSDictionary 等 用 copy 修饰,因为有可能赋值一个可变类型的指针,此时能保证属性值不会受外界影响。

// .h 文件
@property (nonatomic, copy) NSArray * nArr; // .m 文件
{
NSMutableArray * mArr = [[NSMutableArray alloc]
initWithObjects:@"a", @"b", @"c", nil];
self.nArr = mArr; // setter方法赋值时, 内容拷贝(深拷贝) [mArr addObject:@"d"];
NSLog(@"%@ %p %p", self.nArr, self.nArr, mArr);
}
2018-10-16 19:27:27.678093+0800 Demo[63966:933713] (
a,
b,
c
) 0x60000024e070 0x60000024c960 // 地址不同

自定义对象需要实现NSCoping 协议:

- (instancetype)copyWithZone:(NSZone *)zone
{
AModel * model = [[[self class] allocWithZone:zone] init];
model.title = self.title;
model.desc = self.desc;
return model;
}

对比:strong 、copy
strong 的赋值是多个指针指向同一个地址,
copy 的赋值是每次会在内存中赋值一份对象,指针指向不同的地址。

  • 在MRC下,block属性为什么要用copy来修饰?
    因为block在创建时,它的内存是分配在栈(stack)上的,而不是在堆(heap)上,栈内存可能被随时回收。本身的作于域属于创建时的作用域,一旦在创建时候的作用域外调用block,将导致程序崩溃。通过copy可以把block拷贝到堆,保证block的声明域外使用。
    在ARC下写不写都行,编译器会自动对block进行copy操作。

assign

主要用于修饰 基本数据类型 等非OC对象,如 NSIntegerCGFloat等。
这些数值主要存在于中。

可以用来修饰对象。但是!被assign修饰的对象在释放后,指针的地址没被置为nil,成为野指针。如果后续在分配对象到堆上的某块内存时,正好分到这块地址,程序就会crash。

不管是 MRC 还是 ARC,使用 assign 时,都需要注意释放。

weak

指向 但不拥有该对象。其修饰的对象引用计数不会增加,属性所指的对象遭到摧毁时,值会清空。
ARC 环境下一般用于修饰可能会引起循环引用的对象。
delegate、xib 控件用 weak 修饰。

在使用 delegate 时,需要注意:

  • MRC 下,使用 assign。
  • ARC 下,都建议使用 weak,防止出现循环引用。否则如果用assign,当页面销毁时,很可能出现 delegate 对象无效,导致程序 crash。

unsafe_unretained

与 weak 类型相似,但是销毁时不自动清空,容易形成野指针。

对比:
weak 引用的 OC 对象被销毁时,指针会被自动清空,不再指向销毁的对象,不会产生野指针错误;
assign 修饰基本数据类型,内存在栈上由系统自动回收。修饰对象类型时,也可能存在野指针。


@property、@dynamic 和 @synthesize

@property

@property = ivr + getter + setter
编译器自动编写访问这些属性所需的方法。

@dynamic

告诉编译器不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。即使编译器发现没有定义存取方法也不会报错,运行期会导致崩溃。

@synthesize

在类的实现文件里, 指定实例变量的名称。

源地址

iOS 关键词assign、strong、copy、weak、unsafe_unretained的更多相关文章

  1. iOS retain、strong、weak、assign

    iOS retain.strong.weak.assign strong与weak是由ARC新引入的对象变量属性xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和a ...

  2. iOS中assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义  转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...

  3. iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用

    1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...

  4. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  5. assign, retain, copy, weak, strong

    一.assign, retain, copy 的区别(引用计数 RC reference count) 参考:IOS基础:retain,copy,assign及autorelease 1. 假设你用m ...

  6. iOS中assign,copy,retain之间的区别以及weak和strong的区别(面试)

    • copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象. • assign:  简单的直接赋值,相 ...

  7. 对于atomic nonatomic assign retain copy strong weak的简单理解

    atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环 ...

  8. iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

  9. property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

随机推荐

  1. Java-JUC(十四):SimpleDateFormat是线程不安全的

    SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析.格式 ...

  2. PHP系列 | PHP5.6 安装 endroid/qr-code 遇到的问题

    官方库地址:https://packagist.org/packages/endroid/qr-code PHP5.6 的最高版本为:2.5.1 通过composer安装 composer requi ...

  3. arcpy实例教程-上游流域下游流域查找

    arcpy实例教程-上游流域下游流域查找 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:对于选定某一流域,查找其直接(一次)的上游流域和下 ...

  4. vue使用formData进行文件上传

    本文为博主原创,未经允许不得转载 1.vue页面 <ux-form ref="formRef" layout="vertical"> <ux- ...

  5. Java基础 变量名的开头可以使用$

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  6. 爬虫中BeautifulSoup4解析器

    CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会 ...

  7. 【Linux】使用 walle + docker-compose 部署上线单获取不到分支的解决办法

    背景: 使用walle+docker 自动化部署项目.在新建上线单时候拉取不到分支,并提示有错误.但是没有错误信息 错误排查: 首先确保远程仓库已添加宿主机公钥,且一定先在宿主机手动连接一下远程仓库, ...

  8. [LeetCode] 138. Copy List with Random Pointer 拷贝带随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  9. LeetCode:第K个排列【60】

    LeetCode:第K个排列[60] 题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: &quo ...

  10. Kubernetes StatefulSet

    StatefulSet 简介 在Kubernetes中,Pod的管理对象RC.Deployment.DaemonSet和Job都是面向无状态的服务.但现实中有很多服务是有状态的,特别是一些复杂的中间件 ...