retain、strong、weak、assign区别

1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。
2. 了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到 2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。
3. 上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。
4. copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。

1.assign: 用于非指针变量。用于基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char)另外还有id

 反正记住:前面不需要加 “*” 的就用assign吧,weak 就是相当于assign
 
2. retian 释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,用于指针变量。就是说你定义了一个变量,然后这个变量在程序的运行过程中会被更改,并且影响到其他方法。xcode4.3及以后版本上面开发,retian和strong都是一样的,没区别
3. copy :  效果其实和retain没什么两样,唯一的区别就是copy只用于NSString而不能用于NSMutableString,如果当一个类继承NSObject,那么这个类里面的属性需要使用copy。
retain是指针拷贝,copy是内容拷贝。

转载于:https://www.cnblogs.com/lihaibo-Leao/p/5242909.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java游戏有易筋经_当年武侠游戏中绝世秘籍易筋经!重置游戏几十次,玩家才终于找到?...

原标题:当年武侠游戏中绝世秘籍易筋经!重置游戏几十次,玩家才终于找到?在金庸的笔下产生过诸多绝世武学,其中最常被人提及的莫过于少林绝学易筋经。这部由达摩祖师于嵩山少林寺面壁9年留下的武学经书,亦是武…

python路径怎么找windows_如何查看 windows 中 Python安装路径

答疑 qq:3081655843公号: 天枢子python课堂windows平台如果python已经安装好了的话,打开命令行窗口,输入python命令回车,能够进入到python的命令行界面。这个时候我们能够确定的就是,python的安装路径一定被…

微软是如何解决 PC 端程序多开问题的——内部实现

前言上次,我们通过《引用 Microsoft.VisualBasic 解决程序多开的问题》。虽然它非常简单,但是仅适用于 WinForm 应用程序,而且还需要引用不常用的Microsoft.VisualBasic类库。因此,我们决定深挖一下,看看具体是如何实现…

C#常用命名空间

MSDN上的C#.NET Framework类库文档目录树,本人觉得有点不得要领,于是参考搜到的结果简单整理如下: 一、基础命名空间 System 处理内建数据、数学计算、随机数的产生、环境变量、垃圾回收器及一些常见的异常和特征. System.Collections 包含了…

svn之回滚到指定版本

1 问题 我们用svn下载了最新的代码,但是我们需要回退到制定的版本 2 操作 我们先svn showlog 找到对应的版本号 如果用的是svn图形界面客户端 我们点击关联svn项目的鼠标右键,然后有个update to reversion 写上相应的版本即可

番茄工作法—《可以量化的管理学》

6.5.4时间t与番茄工作法 内容提要:番茄工作法划分工作和休息时间,将时间划分为小块,有利于提高工作和休息的效率,提高时间的感知和掌控。 番茄工作法是简单易行的时间管理方法,是由弗朗西斯科西里洛于1992年创立的一种…

【C语言简单说】十二:逻辑运算符

**总觉得今天更两节就好了。 ( ̄. ̄) ** 困。。。( ̄. ̄) \ 今天我们来加深if的使用,我们来讲解运算符&&和||,一个叫做 与&& 一个叫做 或&&;我们先来说 && 我们…

C#遍历一个文件夹下的所有可执行文件

using System; using System.IO;namespace IO操作 {class Program{static void Main(string[] args){Console.WriteLine(File.Exists("C:\IO.txt"));Console.WriteLine(Directory.Exists("C:\"));Console.WriteLine();//获取一个路径下所有可执行文件&…

linux c之把最简单的字符串数据追加写入文件

1 问题 把最简单的字符串数据追加写入文件 2 代码实现 #include <stdio.h> #include <string.h>void write_data_to_file(const char *path, char *str) {FILE *fd fopen(path, "a");if (fd NULL) {printf("fd is NULL and open file fail\n&qu…

Android Json 解析

方法一 使用API解析 json&#xff1a; {"beaconid":"2397","state":"01","userid":"90"} 获取json的方法 private void sendRequestWithHttpClient(){new Thread(new Runnable() {Overridepublic void run() {try…

C#中static void Main(string[ ] args)中的作用及解释

C#中static void Main(string[ ] args)中的作用及解释 static 表示方法是静态的就是说方法在程序被编译的时候就被分配了内存,使用的时候不用生成某个类型的对象,知道程序退出才释放。 void 表示方法没有返回值,就是方法没有renturn 关键字。 main 是方法名,当然这个方法是…

电脑配置java编译报错_java 编译错误

我有两个简单的代码&#xff0c;ClickMe.java代码为&#xff1a;importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*;publicclassClickMeextendsAppletimplementsMouseListener{privateSpo...我有两个简单的代码&#xff0c;ClickMe.java代码为&#xff1a;imp…

正则匹配字符串无匹配不到_实现简单正则表达式匹配

这是facebook的面试题实现包含以下特殊字符的正则表达匹配“.” 匹配任意一个字符“*” 匹配任意多个前面的字符例如给定正则表达“ra.”和字符串“ray”你的函数应该返回true&#xff0c;但是仍用这个正则匹配另一个字符串“raymond”应当返回false给定正则表达“.*at”和字符…

【C语言简单说】十三:逻辑运算符||

&#xff08;﹏&#xff09;~ 更完睡觉。 这一节我们来说说逻辑或||&#xff0c;其实很简单的&#xff0c;既然你们理解了第一个逻辑与&#xff0c;那么逻辑或就没什么难度了。 我们说过逻辑与就像我们的并列关系&#xff0c;例如我们吃了苹果和李子。我们现在的逻辑或呢&a…

C#中元组对象Tuple的使用

简介元组使用泛型来简化类的定义&#xff0c;多用于方法的返回值。在函数需要返回多个类型的时候&#xff0c;就不必使用out , ref等关键字了&#xff0c;直接定义一个Tuple类型&#xff0c;使用起来非常方便例子在我们编程时&#xff0c;比如一个人的信息&#xff0c;我们常常…

linux之通过strings命令查看so里面是否包含****字符串

1 问题 比如我们在一个C文件里面或者C++文件里面添加了日志打印字符串***,但是实际上没打印,我们会怀疑这个打印字符串有没有加到so里面去,那我们有什么办法呢?用strings命令 strings ***.so | grep 关键字 strings命令是在对象文件或者二进制文件中查找可打印的字符串 …

HQ-day2 C#语言基础

今天主要学习了C#的一些语言基础。 主要有&#xff1a;输入、输出。 一丶输入Console.readline(); 输入语句 输出console.write(); 输出语句 Console.writeline(); 输出语句自动换行 注释 CtrlK 然后 按C &#xff0c;注释选中部分 CtrlK 然后 按U&#xff0c; 取消注释 二、…

删除 oracle

C:\app\Administrator\product\11.2.0\client_1\deinstall 用这个批处理文件,会把oracle全部删除,除这个目录本身以外 .另外它不删除服务,即使服务已经被停止(不停止也无法卸载). 采用 sc delete 服务名,删除服务.

程序员应该选择哪种语言来学习更好?应该如何学

还记得自己那年考清华失败&#xff0c;被调剂到中科大软院&#xff0c;当初有几个方向可以选&#xff0c;软件设计、嵌入式、信息安全等等&#xff0c;毫不犹豫地选择了信息安全。为什么选信息安全&#xff1f;这四个字听起来多牛多有感觉&#xff0c;我本科是学物理的&#xf…

C#文件写入操作

using System; using System.IO;namespace IO操作 {class Program{static void Main(string[] args){using(StreamWriter wFile.AppendText("IO.txt")){TextIn("Hello GeoStorm", w);TextIn("Hello World",w);w.Close();}}public static void Te…