copy strong weak

copy: 创建一个引用计数为1的对象,然后释放旧的对象

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为 1

Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化

retain到另外一个NSString之 后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

也就是说,retain是指针拷贝,copy是内容拷贝。在拷贝之前,都会释放旧的对象。

1、使用copy: 对NSString
2、使用retain: 对其他NSObject和其子类


strong与weak是由ARC新引入的对象变量属性

ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。


@property(strong) MyClass *myObject;

相当于@property(retain) MyClass *myObject;


@property(weak) MyOtherClass *delegate;

相当于@property(assign) MyOtherClass *delegate;


强引用与弱引用的广义区别:
强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。
弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。


简单讲strong等同retain
weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻

[color=red]alloc都是strong,weak只是一些数字类型,copy是字符串
控件一般为 weak [/color]

ARC
自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误。
同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存。
总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性。 dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码。不需要手动调用[super dealloc]
不要调用retain,release,autorelease,编译器会自动插入相关代码。 注意命名方式,不要以copyXXX方式命名不想进行retain的方法,编译器会根据方法名自动retain。
C语言结构体中不要有对象指针
id和void*只能通过桥接转换来进行转换
不要使用NSAutoreleasePool,而是使用@autoreleasepool{}代码块。 转换ARC代码:Edit->Refactor->Convert to Objective-C ARC
strong 相当于retain。
Strong在ARC环境为默认属性类型。 @property (nonatomic,readwrite,strong)NSString *title;
[color=brown]@property (strong, nonatomic) UIViewController *viewController;[/color]
@property (nonatomic, strong) id childObject; Default
[color=green]weak 取代之前的assign,对象销毁之后会自动置为nil,防止野指针。[/color]
Assign不能自动置为nil,需要手动置为nil。
[color=violet] Delegate基本总是使用weak,以防止循环引用。[/color]特殊情况是,希望在dealloc中调用delegate的某些方法进行释放,此时如果使用weak将引起异常,因为此时已经是nil了,那么采用assign更为合适。 [color=darkred]@property (weak, nonatomic) IBOutlet UIButton *myButton;//处于最顶层的IBOutlet应该为strong[/color]
@property (nonatomic, weak) id parentObject;
@property(nonatomic,readwrite,weak) id <MyDelegate> delegate;
@property (nonatomic, weak) NSObject <SomeDelegate> *delegate;
assign 对基础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char等) ’@property (nonatomic, assign) int n;
@property (nonatomic, assign) BOOL isOK;
@property (nonatomic, assign) CGFloat scalarFloat;
@property (nonatomic, assign) CGPoint scalarStruct; Default
retain NSObject及其子类。
Release旧值,retain新值。
Retain是指针复制(浅复制),引用计数加1,而不会导致内容被复制。 @property (nonatomic, retain)UIColor *myColor;
atomic Default
nonatomic 非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能
unsafe_unretained
copy 复制内容(深复制),如果调用copy的是数组,则为指针复制(浅复制),仅仅复制子元素的指针。 [color=darkblue]@property (nonatomic,copy)NSString *title;[/color]
@property (nonatomic, copy) NSMutableArray *myArray;//not recommended
@property (nonatomic, copy) SomeBlockType someBlock;
readonly
readwrite Default
retain cycle
循环保留 delegate和block是产生retain cycle的主要原因
dealloc 移除观察者observers
注销通知notification
设置非weak的delegate为nil
取消timer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值