关键词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. easyui datagrid怎么动态获取表头的列名及显示名称

    说明:目前使用easyui combobox多选属性,绑定的数据源是来自datagrid的表头的列名及显示名称 处理方法: //获取冻结的数据源并返回key,value格式数据 var GetFroz ...

  2. [转]Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    原文地址:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会 ...

  3. hive中function函数查询

    1. desc function [函数名] desc function xpath; 查询用法: 2. desc function extended [函数名] desc function exte ...

  4. 【winform】主窗体多线程给子窗体传值

    1.主窗体多线程给子窗体传值 解决方案:主要使用委托,因为会出现跨线程错误 主窗体 public FormMain() { InitializeComponent(); //background th ...

  5. openresty开发系列31--openresty执行流程

    openresty开发系列31--openresty执行流程 我们先看个例子 location /test {    set $a 32;    echo $a;    set $a 56;    e ...

  6. Java12新特性 -- Shenandoah GC

    Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣布进行的一项垃圾收集器研究项目 Pauseless GC 的实现,旨在针对 JVM 上的内存收回实现低停顿的需求.该设计将与应用程 ...

  7. html页面自适应宽度

    html页面实现响应式的方式有很多,本篇介绍懒人必备一招见效的方法. 在head标签中加入 <meta name="viewport" content="width ...

  8. 小数末尾是0的,不显示0,有值才显示 StringFormat

    JAVA public static void main(String[] args) { DecimalFormat df = new DecimalFormat("###.##" ...

  9. [LeetCode] 681. Next Closest Time 下一个最近时间点

    Given a time represented in the format "HH:MM", form the next closest time by reusing the ...

  10. Kubernetes 配置管理 Dashboard(十三)

    目录 一.安装配置 1.1 下载 镜像 1.2.安装 1.3.修改 NodePort 二.配置授权 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户 ...