strong、weak、copy、assign 在命名属性时候怎么用

一直都在疑惑属性定义中在什么情况下用strong、在什么情况下用weak?

总结大致如下:

1.weak 是用来修饰代理(delegate)和UI控件。

2.strong 是用来修饰除了代理(delegate)、UI控件、字符串(NSString)以外的对象类型。

3.copy 是用来修饰字符串(NSString)。

4.assign 是用来修饰基本数据类型(非对象类型),如:int、float、bool、menu等。

解析为何控件用weak。

如图(1)所示,第一个描述的是一个控制器上边有一个按钮(button)和控制器本身的view。两者同属于UIView的subviews(子控件),而subviews是以数组形式存在的,它内部有两个地址分别存储view和button。而view本身就是以强指针类型(retain)存在的属性,故当view一直存在的时候subviews就会一直被引用,而subviews中的button就不会消亡,所以控件btn属性声明时可用weak,当然也可以用strong只是官方推荐用weak而已。所以遵循官方声明采用weak。防止内存泄漏带来的性能消耗。

                  图 1

解析为何代理(delegate)用weak。

如图(2)所示,UITableviewController中的tableview属性(强指针类型)它是直接指向UITableview的,而UITableview中的delegate属性的本质就是UITableviewController ,当delegate是强指针类型的时候会出现循环引用的情况,直接导致两个对象不能销毁,从而引起内存泄漏,所以根据两个对象相互引用,必有一个是弱类型的原则。而tableview是系统定义的我们不能进行改动,故而当我们定义引用类型必须是弱类型(weak)。

* 未完待续。。。

时间: 2024-10-11 12:34:48

strong、weak、copy、assign 在命名属性时候怎么用的相关文章

关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

@property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. NSObject对象的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样: NSLock *_lock = [[NSLock alloc]ini

IOS中级篇——何时使用copy,strong,weak,assign关键字 定义属性

? 父类指针可以指向子类对象 ? //定义block别名. typedef void (^LYItemOption)(); @interface LYItemArrow : LYItem@property(nonatomic,strong) Class desController; @property(nonatomic,copy) LYItemOption option; ? ? 1.strong :除NSString\block以外的OC对象 ? @property(nonatomic,st

[iOS基础控件 - 6.12.3] @property属性 strong weak copy

A.概念 @property 的修饰词 strong: 强指针/强引用(iOS6及之前是retain) weak: 弱智真/弱引用(iOS6及之前是assign) 默认情况所有指针都是强指针 使用 "__weak" 修饰的指针是弱指针 ARC准则:只要没有强指针指向,对象就会被销毁 @property属性的用法 * weak(assign) :  代理\UI控件* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)* copy : 字符串 * assign

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

readwrite:是可读可写特性,需要生成getter和setter方法:readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用:alloc 对象分配后引用计数为1retain 对象的引用计数+1 copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变assign:是赋值特性,setter方法将传入参数赋值给实例变量(一把钥匙,同进同出):用于基础数据类型:weak:由ARC引入的对象变量的属性,比assign多了一个

strong ,weak,copy关键字使用,及weak跟assign区别

1strong和weak都是针对对象 2strong持有对象的所有权 3weak不持有对象的所有权 什么时候使用weak 1.委托 为了规避循环引用 使用weak限定delegate指针 2.SB拖拽控件 可以使用weak关键字限定属性 与assign的区别 1.weak只能修饰对象指针,assign可以修饰任意类型指针 2.weak指针指向的对象被释放 weak指针自动置为nil,assign不会自动置为nil copy关键字如何使用 1.block 在栈区分配内存(系统管理其内存) 拷贝到堆

copy,assign,strong,retain,weak,readonly,nonatomic的区别

copy与retain:1.copy其实是建立了一个相同的对象,而retain不是:2.copy是内容拷贝,retain是指针拷贝:  3.copy是内容的拷贝 ,对于像NSString,的确是这样,但是如果copy的是一个NSArray呢?这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".4.copy的情况:NSString *newPt = [pt copy];此时会在堆上重新开辟一段内存存放@"abc" 比如0X1122 内容为@&q

转 iOS:ARC相关知识,assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

    自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误.     同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存.     总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性. dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码.不需要手动调用[super  dealloc]   不要调用retain,release,autorelease,编译器会自动插入相关代码. 注

copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效.更深入的讨论,请参考“复制”部分. retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1对其他NSObject和其子类对参数进行release旧值,再retain新值指定retain会在赋值时唤醒传入值的retain消息.此属性只能用于Objective

assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

arc其实并不是所谓的垃圾回收机制,其实arc只是编译器的一种特性,编译器会在编译阶段插入相应的内存管理代码,以实现自动的内存管理,这样就减少了因为程序员的一时疏忽或者项目过大而失误从而造成内存泄露,因为是编译器自动完成的代码插入所以arc的效率要高于垃圾回收机制. 在arc机制下dealloc中会由编译器自动插入释放属性的代码因此也不需要手动调用[super dealloc],当然arc只能管理foundation层的对象对于core foundation层的变量需要程序员手动去释放或者使用桥