copy: NSString\NSMutableString\Block

weak: 代理、UI控件(weak)

strong: 其他OC对象

assign: 基本数据类型(int\float)、枚举、结构体

一般都是在ARC中,对于ARC来说,对象释放的最终根据还是根据引用计数为0时去释放。而weak与strong的根本区别是在set方法中,weak的set方法和strong的set方法都是释放旧值保留新值,但是weak的set方法会对其autorelease,即延迟release一次,而strong的set方法也是释放旧值保留新值,但是其不会延迟release。最终效果是strong会+1,weak不会+1.
要注意,用去赋值的时候是不调用set方法的,也就是说无论weak还是strong,只要用赋值都不会对引用计数加1,区别在于self.语法会调用set方法,strong的self.会调用set方法+1.而weak的_和self.语法都不会+1.

所以,建议用weak,用weak时无论用_和.语法都不会导致+1。用strong时用self.语法会导致+1.建议用weak。同时weak在对象回收以后可以将对象指针置成nil。

3.2 遵守 NSCopying 协议的对象使用 .

nonatomic ( ARC/MRC )

1.不对set方法加同步锁 .

2.性能好

3.线程不安全

atomic ( ARC/MRC )

1.原子属性就是对生成的 set 方法加互斥锁 @synchronized(锁对象) .

@synchronized(self) { _delegate = delegate;}

2.需要消耗系统资源 .

3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 .

4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 .

nonatomic 和 atomic 的介绍和区别

1. 什么是atomicity(原子性)?

atomicity(原子性):我把原子性理解成线程对属性的单一执行。

例如,当两条线程同时执行一个属性的set方法的时候,如果不具有原子性(也就是声明属性时使用了nonatimic),那么就可能出现当A线程正在改写某属性值的时候,B线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读取到的属性值肯能不对。

2. 保证atomicity真的就线程安全了吗?为什么日常声明都用的是nonatomic呢?

1.保证atomicity并非也是线程安全的,如果需要保证安全,需要跟深层次的线程锁定机制。

2.使用同步锁在iOS中开销比较大,会给程序带来性能上的问题。

3. 为什么atomicity也不能保证线程安全?

例如:当使用atomic时,仍然可能出现线程错误:当线程A进行set操作,这时其他线程的get或者set操作会因为等该操作而等待。当A线程的set操作结束后,B线程进行set操作,然后当A线程需要get操作时,却获得了在B线程的值,这就破坏了线程安全,如果有C线程在A线程get操作之前release了该属性,那么还会导致程序崩溃。所以仅仅使用atomic并不会使得线程安全,我们还是要为线程添加lock来确保线程的安全。

readonly (只读)

1.让 Xcode 只生成get方法 .

2.不想把暴露的属性被人随便替换时 , 可以使用 .

readwrite (读写)(默认)

1.让 Xcode 生成get/set方法 .

2.不用 readonly 修饰时 , 默认就是 readwrite .

修饰词:assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite

其中

ARC:assign、weak、strong、copy

MRC:assign、retain、copy、nonatomic、atomic

assign ( ARC/MRC )

1.这个修饰词是直接赋值的意思 , 整型/浮点型等数据类型都用这个词修饰 .

2.如果没有使用 weak strong retain copy 修饰 , 那么默认就是使用 assign 了. ( 它们之间是有你没我的关系 )

3.当然其实对象也可以用 assign 修饰 , 只是对象的计数器不会+1 . ( 与 strong 的区别 )

4.如果用来修饰对象属性 , 那么当对象被销毁后指针是不会指向 nil 的 . 所以会出现野指针错误 . ( 与weak的区别 )

weak ( ARC )(对象)

1.弱指针是针对对象的修饰词 , 就是说它不能修饰基本数据类型(int float) .

2.weak 修饰的引用计数器不会+1 , 也就是直接赋值 .

3.弱引用是为打破循环引用而生的,比如在Block中,block在copy的时候,会对内部使用到的对象的引用技术+1,如果使用[self 方法名],那么就会有一个强指针指向self所在的class的内存地址,class的引用计数会+1,这样一来会导致class所在的内存地址无法被释放,造成内存泄漏 .

4.它最被人所喜欢的原因是 它所指向的对象如果被销毁 , 它会指向 nil . 从而不会出现野指针错误 .

weak 和 assign的区别

assign与weak,它们都是弱引用声明类型,但是他们是有区别的。

1.用weak声明的变量在栈中就会自动清空,赋值为nil。

2.用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!

以delegate的声明为例,在MRC中多delegate声明使用的是assign,这是为了不造成循环引用,这时,我们需要在-dealloc方法中写上 self.delegate = nil,以免造成delegate的野指针错误。当然,在ARC中,只需要用weak声明delegate,就会自动释放了。

strong ( ARC )(对象)

1.直接赋值并且对象的引用计数器 +1 .

2.在 ARC 里替代了 retain 的作用 .

retain ( MRC )

1.release 旧对象( 旧对象计数器 -1 ) , retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 .

2.在set方法里面是这样的 :

if (_dog != nil)

{

[_dog release];

}

_dog = [dog retain];

copy ( ARC/MRC )

1.copy 在 MRC 时是这样做的 release 旧对象( 旧对象的引用计数器 -1 ) , copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 .(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)

1.1在set方法里面是这样的 :

if (_dog != nil)

{

[_dog release];

}

_dog = [dog copy];

2.copy 在 ARC 时是这么干的 copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 .

2.1在set方法里面是这样的 :

_dog = [dog copy];

3.使用注意 :

3.1 修饰的属性本身要不可变的。例如 NSMutableArray 采用 copy 修饰 , 在addObject时会出现Crash, 因为NSMutableArray的对象在copy 过后就会变成NSArray。如果需要copy NSMutableArray对象,用:mutablecopy。

3.2 遵守 NSCopying 协议的对象使用 .

nonatomic ( ARC/MRC )

1.不对set方法加同步锁 .

2.性能好

3.线程不安全

atomic ( ARC/MRC )

1.原子属性就是对生成的 set 方法加互斥锁 @synchronized(锁对象) .

@synchronized(self) { _delegate = delegate;}

2.需要消耗系统资源 .

3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 .

4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 .

nonatomic 和 atomic 的介绍和区别

1. 什么是atomicity(原子性)?

atomicity(原子性):我把原子性理解成线程对属性的单一执行。

例如,当两条线程同时执行一个属性的set方法的时候,如果不具有原子性(也就是声明属性时使用了nonatimic),那么就可能出现当A线程正在改写某属性值的时候,B线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读取到的属性值肯能不对。

2. 保证atomicity真的就线程安全了吗?为什么日常声明都用的是nonatomic呢?

1.保证atomicity并非也是线程安全的,如果需要保证安全,需要跟深层次的线程锁定机制。

2.使用同步锁在iOS中开销比较大,会给程序带来性能上的问题。

3. 为什么atomicity也不能保证线程安全?

例如:当使用atomic时,仍然可能出现线程错误:当线程A进行set操作,这时其他线程的get或者set操作会因为等该操作而等待。当A线程的set操作结束后,B线程进行set操作,然后当A线程需要get操作时,却获得了在B线程的值,这就破坏了线程安全,如果有C线程在A线程get操作之前release了该属性,那么还会导致程序崩溃。所以仅仅使用atomic并不会使得线程安全,我们还是要为线程添加lock来确保线程的安全。

readonly (只读)

1.让 Xcode 只生成get方法 .

2.不想把暴露的属性被人随便替换时 , 可以使用 .

readwrite (读写)(默认)

1.让 Xcode 生成get/set方法 .

2.不用 readonly 修饰时 , 默认就是 readwrite .

 

感谢:

ios 修饰词作用的更多相关文章

  1. 属性(@property)的修饰词有哪些,各自是什么作用,在哪种情况下用?

       之前面试了几家公司,都会问到这个基础的问题,以前,没有怎么注意,所以答的很混乱,所以查了查网上的资料,特意整理了一份.   常见修饰词有:assign.weak.strong.retain.co ...

  2. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  3. Chapter6_访问权限控制_访问权限修饰词

    Java中有四种访问权限,public,private,protected和包访问权限,它们是置于类中每一个成员之前的定义,无论是一个域还是一个方法,下面一一介绍. 一.包访问权限 如果不提供任何访问 ...

  4. 关于 Java正则表达式中的Possessive数量修饰词的理解

    关于 Java正则表达式中的Possessive数量修饰词的理解 正则表达式对于数量限定符如 ?, + , *, {n, m} 的匹配默认是贪婪模式,比如: a.*b   匹配 acbab 的结果是 ...

  5. 访问修饰词--Java

    public(公共的) 权限: 完全公开 protected(受保护的) 权限: 对子类和同包中的其他类公开 default(默认的,可不写) 权限: 对同包中的其他类公开 private(私有的) ...

  6. Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)

    在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...

  7. 修饰词public、private、protected、默认、四者之间的区别

    在Java语法中,对于类与类中的成员变量和成员方法是通过访问控制符来区分控制的. 下面来看看这四种访问控制符的区别:(public.protected.private.default) 1.publi ...

  8. Java编程思想学习笔记——访问权限修饰词

    几种访问权限修饰词 public,protected,private,friendly(Java中并无该修饰词,即包访问权限,不提供任何访问修饰词) 使用时,放置在类中成员(域或方法)的定义之前的,仅 ...

  9. Django ORM常用的函数以及修饰词

    函数名称或修饰词 说明 filter() 返回符合指定条件的QuerySet exclude() 返回不符合指定条件的QuerySet ordey_by() 串接到QuerySet之后,针对某一指定的 ...

随机推荐

  1. restTemplate源码解析(三)创建ClientHttpRequest请求对象

    所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 上一篇文章中,我们大体看了一下restTemplate的核心逻辑.再回顾一下核心代码 p ...

  2. (六)图数据neo4j之cypher(一)

    1.Cypher概述 cypher是一种声明式的图数据库查询语言,能高效的查询和更新图数据库,是依赖于模式的.所谓模式(Patterns)是就是众多节点和关系的任意复杂想法. (1)节点语法 cyph ...

  3. Js调用本地exe的方式

    1.     使用记事本(或其他文本编辑器)创建一个myprotocal.reg文件,并写入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSE ...

  4. Netty4实现JTT809对接

    网上的使用的netty版本过老,最近自己接触到这一块,重新写了一个 服务器流程 1,判定报文起始和结束标识 ,2去掉头尾标识进行转义,3,去掉CRC码进行CRC计算,4读取报文头,(5,如果加密则解密 ...

  5. 什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

    什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

  6. tp5 左连接

    db('detainform')->alias('d')->join("information i",'i.z_id=d.z_id','LEFT')->where ...

  7. #Python语言程序设计Demo - 七段数码管绘制

    Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...

  8. Wannafly挑战赛24-A-石子游戏--【思维题】

    链接:https://www.nowcoder.com/acm/contest/186/A 来源:牛客网 石子游戏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  9. asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别 转载自:http://blog.csdn.net/luoyeyu1989/article/details/8275866

    首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. MVC是 Model-View-Controller,严格说这三个加起来 ...

  10. 表单文本字段预期描述(placeholder="请输入产品名称"以及prompt:'输入价格')

    普通html文本标签设置: <input id="xxx" placeholder="请输入产品名称"/> 带有jQueryEasyUI插件的htm ...