assign和weak的深层次解析】的更多相关文章

我们知道在设置类的属性时,控件一般中weak,对象一般用strong,数据类型一般使用assign,其中weak和assign都不会使计数器增加,那为什对象不可以使用assign呢? weak与assignd的区别: weak:弱指针,不会让引用计数器+1,当其指向的对象被销毁时,这个弱指针会被清空,nil assign:不会使引用计数器+1,但对象被销毁时,指针不会清空,若用它来修饰对象,有可能会产生野指针. @property (nonatomic, assign) UIView *redV…
在ARC中的assign和weak可以说非常相像,导致有很多人误以为他们是一摸一样的,在任何时候都可以划等价,但事实却不是这样. 在群里,有人问,id类型的delegate属性到底是用assign还是weak @property (weak, nonatomic) id<AnyDelegate> delegate; @property (assign, nonatomic) id<AnyDelegate> delegate; 大家众说纷纭,说都可以的,说assign的,说weak的…
weak 比 assign 多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为 nil ,这样再向 weak 修饰的属性发送消息就不会导致野指针操作crash. 可能不太好理解下面我写了一个演示程序. OC: 12345678910111213141516171819202122232425 //// ViewController.m// weak与assgin的区别//// Created by bihongbo on 14/5/20.// Copyright…
今天一个同事写代码,把一个delegate对象设定成了assign类型属性,没有用weak,就是delegate对象释放后,不会把delegate指针自动设定为nil,把对象的delegate设定成了UITableViewCell,当这个cell被系统回收后,在通过delegate调用就会crash.我调试时看到delegate指针的确不是nil,纳闷了很久,竟然是因为他用了assign属性....我感觉delegate不应该使用assign!应该使用 weak 才能保证程序的健壮性. assi…
assign:用于“纯量类型”(如CGFloat 或 NSInteger等): strong:用于“对象类型”,定义了一种“拥有关系”(owning relationship),为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去: weak:用于“对象类型”,定义了一种“非拥有关系”(nonowning relationship),为这种属性设置新值时,设置方法既不保留新值,也不释放旧值,相当于用另一个属性指向原来的对象,关键在于当属性所指的对象被释放时,该属性值也会清…
引用地址:http://www.aichengxu.com/view/32930 一.assign,copy,retain 1.copy是内容复制,新建一个相同内容的不同指针,retain为指针复制,相同内容的相同指针,引用计数都加1.assign只是复制,没有引用计数. 2.retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1.我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容.copy:与retain处理流程…
在objective-c中,类中的全局变量经常使用如下的方式申明. @property(nonatomic(1),strong(2))UIImageView *imageView; 其中的1,2处是对此变量的一些属性申明.有以下几种strong weakassignstrong 和 weak 是在arc后引入的关键字,strong类似于retain,引用时候会引用计算+1,weak相反,不会改变引用计数.weak和assign都是引用计算不变,两个的差别在于,weak用于object type,…
用了很久,却不知道它俩究竟有什么区别,作为一个新手来说,光会用不行,还要懂得原理. 首先说说区别:weak只可以修饰对象                    assign既可以修饰对象也可以修饰基本数据类型,如int.double和NSIntegerdeng . weak不会产生野指针问题               assign可能导致野指针问题,导致程序崩溃. 下面我们说说原因:weak弱引用,所引用对象的计数器不会加一,对象被释放时指针自动被置为nil,避免了循环引用. assign虽说…
依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内容为转载: IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样. (一般情况下: 后面会讨论例外情况)alloc 对象分配后引用计数为1retain 对象的引用…
lua weak table 经常看到lua表中有 weak table的用法, 例如: weak_table = setmetatable({}, {__mode="v"}) 官网上的解释: http://www.lua.org/pil/17.html Weak tables are the mechanism that you use to tell Lua that a reference should not prevent the reclamation of an obje…
转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp RegExp 构造函数创建了一个正则表达式对象,用于将文本与一个模式匹配. 有关正则表达式的介绍,请阅读 JavaScript指南中的正则表达式章节. 语法 字面量, 构造函数和工厂符号都是可以的: /pattern/flags new RegExp(pattern [, flags]) RegExp(pattern…
strong,weak, retain, assign的区别 strong与weak是由ARC新引入的对象变量属性 xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcode 4.3(ios5和以上版本)之后就有了ARC,并且开始使用 strong与weak assign: 用于非指针变量.用于 基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等),另外还有id 如:…
strong,weak, retain, assign的区别@property的参数 先说经验 使用场合 copy:NSString,block, weak:UI控件,代理 strong:一般对象.自定义对象 在OC中:默认对对象都是强引用:如果对象没有强引用会被立即释放 assign:基本数据类型,结构体,枚举,非OC对象类型 以下扯淡的比较多 strong与weak是由ARC新引入的对象变量属性 xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assig…
iOS retain.strong.weak.assign strong与weak是由ARC新引入的对象变量属性xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcode 4.3(ios5和以上版本)之后就有了ARC,并且开始使用 strong与weak assign: 用于非指针变量.用于 基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等),另外还有id 如: @p…
强引用和弱引用: 我们已经知道OC中的内存管理是通过“引用计数器”来实现的.一个对象的生命周期取决于它是否还被其他对象引用(是否retainCount=0).但在有些情况下,我们并不希望对象的销毁时间由是否被其他对象引用来决定,而是这个对象本该是什么时候销毁就什么时候被销毁.这时,我们得引入“强引用”和“弱引用”的概念. 强引用:当前对象被其他对象引用时,会执行retain操作,引用计数器+1.当retainCount=0时,该对象才会被销毁.因为我们要进行对象的内存管理,所以这是默认的引用方式…
1.什么是arc?(arc是为了解决什么问题诞生的?) 首先解释ARC: automatic reference counting自动引用计数. ARC几个要点: 在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象. 程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁. 那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC…
在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大家真正领略代理的奥妙. iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. 代理:是一种通用的设计模式,iOS中对代理支持的很好,由代理对象.委托者.协议三部分组成. block:…
可能碰到的iOS笔试面试题(5)--Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between method and selector?) selector是一个方法的名字,method是一个组合体,包含了名字和实现. Core Foundation的内存管理 凡是带有Create.Copy.Retain等字眼的函数,创建出来的对象,都需要在最后做一次release 比如CFRunLoopO…
转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大家真正领略代理的奥妙.写的有点多,但都是干货,我能写下去,不知道你有没有耐心看下去.本人能力有限,如果文章中有什么问题或没有讲到的点,请帮忙指出,十分感谢! iOS中消息传递方式 在iOS中有很…
一.#import 和 #include 的区别,@class代表什么?@class 和 #import 的区别?#import<> 和 #import""的区别 答:使用上的区别: 1>.@class 方式一般用在头文件中需要声明该类的某个实例变量的时候用到,在 .m 文件中还需要使用#import; 2>.使用@class方式由于只需要被引用类的名称就行了,而在实现类中由于要使用被引用类中的实例变量和方法,所以需要使用#import来包含被引用类的头文件.…
所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-Interview-Questions,用[◇]标示,难度是根据我自己的水平来标识的. 其中大部分答案来源于没阳光的午后的三篇 你能用到的iOS面试题(一) 你能用到的iOS面试题(二) 你能用到的iOS面试题(三) 没阳光的午后还写了其他很多有质量的iOS开发文章,大家可以去学习. 第二部分面试题来…
ObjC如何通过runtime修改Ivar的内存管理方式 为什么要这么做? 在iOS 9之前,UITableView(或者更确切的说是 UIScrollView)有一个众所周知的问题: property (nonatomic, assign) id delegate; 苹果将 delegate 的内存修饰符声明为了assign,这是 MRC 时代防止循环引用的不二法门.但是到了 ARC 时代,苹果引入了弱引用修饰符(weak)对原先的(assign)暨非强引用修饰符进行了细分.在大多数场景下,将…
本文转载自:你真的了解iOS代理设计模式吗? 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大家真正领略代理的奥妙.写的有点多,但都是干货,我能写下去,不知道你有没有耐心看下去.本人能力有限,如果文章中有什么问题或没有讲到的点,请帮忙指出,十分感谢! 一.iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式.…
1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atomic是Objc使用的一种线程保护技术, 基本上来讲,是防止在写未完成的时候被另外一个线程读取, 造成数据错误.而这种机制是耗费系统资源的, 所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程, 那么nonatomic是一个非常好的选择. 2.各种属性的解析 weak: <修饰Objec…
李洪强经典面试题49-Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between method and selector?) selector是一个方法的名字,method是一个组合体,包含了名字和实现. Core Foundation的内存管理 凡是带有Create.Copy.Retain等字眼的函数,创建出来的对象,都需要在最后做一次release 比如CFRunLoopObserver…
   之前面试了几家公司,都会问到这个基础的问题,以前,没有怎么注意,所以答的很混乱,所以查了查网上的资料,特意整理了一份.   常见修饰词有:assign.weak.strong.retain.copy.nonatomic.atomic.readonly.readwrite   其中部分用在特定的内存管理中: ARC:assign.weak.strong.copy MRC:assign.retain.copy.nonatomic.atomic   assign ( ARC/MRC ) 1.这个…
接上一篇博文,本篇博文是作者原创,用于记录从网上查阅的一些资料,并对自己的知识体系进行一下总结,成文以供学习使用. 1.Cocoa Touch 包含了什么?不包含什么?与 Cocoa 有什么区别? 相同之处:两者都包含OC运行时的两个核心框架: cocoa包含Foundation和AppKit框架,可用于开发Mac OS X系统的应用程序 cocoa touch包含Foundation和UIKit框架,可用于开发iPhone OS 系统的应用程序 Cocoa时Mac OS X的开发环境,coco…
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一次,而st…
1.Runtime的消息转发机制 消息转发机制基本上分为三个步骤: 1. 动态方法解析 2. 备用接收者 3. 完整转发 2.Runloop的工作原理 runloop.autorelease pool以及线程之间的关系. 每个线程(包含主线程)都有一个Runloop.对于每一个Runloop,系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个像callstack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease poo…
1.#import和#include的区别,@class代表什么? (1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷入递归包含的问题中. (2)#import与@class二者的区别在于: #import会链入该头文件的全部信息,包括实体变量和方法等:而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定 义的,暂时不用考虑.在头文件中, 一般只需要知道被引用的类的名称就可以了. 不需要知道…