1.strong和weak
1.1>
在OC中没有强指针指向的对象就会销毁,所有对象被创建的时候默认是强指针。
比如:
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init];
Car *c = [[Car alloc] init];
}
NSLog(@"---------");
return 0;
}
1.2>
strong和weak修饰属性,__strong(默认就是strong,所以一般不用)和__weak修饰变量
1.3>
控件一般都加在view上,所以一般使用weak即可。比如,[self.view addSubViews:label],这句代码会在self.view.subViews这个数组会加入label,所以在声明label属性的时候一般weak即可,必须注意的是,要先创建一个局部变量,然后加入self.view.subViews数组,然后属性再引用!
1.4>
UITableViewController--->tableview--->delegate---->UITableViewController
如果都是强指针的话会造成循环引用,所以在tableview的delegate为assign属性,这是在MRC中的写法。
一般我们使用代理的时候delegate为weak属性,这是ARC的写法,用weak来取代assign。
2.Autoresizing的代码实现
self.view.autoresizingMask = UIViewAutoresizingFlexibleRightMargin
3.block注意点
如果block是copy属性,那么在它内部使用self会造成循环引用。
为了避免循环引用有三个关键字可以用__unsafe_unretained,__block,__weak,其中__weak是在ARC中使用的,
__weak和__unsafe_unretained的区别是:__weak 当对象释放之后会自动设置为nil,
而__unsafe_unretained不会。
__weak typeof(self) unsafeSelf = self;
typeof(类型),例如:typeof(int) a = 10;相当于int a = 10;
self.age = 10;访问self的属性也会对self进行强引用
_age = 10;也会造成强引用,注意改行代码会自动变成 self->_age = 10;
unsafeSelf.age = 10;