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,好处不言而喻
alloc都是strong,weak只是一些数字类型,copy是字符串
控件一般为 weak
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;
@property (strong, nonatomic) UIViewController *viewController;
@property (nonatomic, strong) id childObject; Default
weak 取代之前的assign,对象销毁之后会自动置为nil,防止野指针。
Assign不能自动置为nil,需要手动置为nil。
Delegate基本总是使用weak,以防止循环引用。特殊情况是,希望在dealloc中调用delegate的某些方法进行释放,此时如果使用weak将引起异常,因为此时已经是nil了,那么采用assign更为合适。 @property (weak, nonatomic) IBOutlet UIButton *myButton;//处于最顶层的IBOutlet应该为strong
@property (nonatomic, weak) id parentObject;
@property(nonatomic,readwrite,weak) id
@property (nonatomic, weak) NSObject
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的是数组,则为指针复制(浅复制),仅仅复制子元素的指针。 @property (nonatomic,copy)NSString *title;
@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