详解iOS应用开发中的ARC内存管理方式

2020-01-14 19:51:38丽君

四、weak指针
weak型的指针变量仍然可以指向一个对象,但不属于对象的拥有者
1.执行下面的代码

复制代码
__weak NSString *name = self.nameField.text; 

 

详解iOS应用开发中的ARC内存管理方式

name变量和nameField.text属性都指向同一个NSString对象,但name不是拥有者

2.如果文本框的内容发生变化,则原先的NSString对象就没有拥有者,会被释放,此时name变量会自动变成nil,称为空指针

详解iOS应用开发中的ARC内存管理方式

weak型的指针变量自动变为nil是非常方便的,这样阻止了weak指针继续指向已释放对象,避免了野指针的产生,不然会导致非常难于寻找的Bug,空指针消除了类似的问题

3.weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController

详解iOS应用开发中的ARC内存管理方式

五、strong和weak指针的使用注意
1.下面代码是有问题的:

复制代码
__weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];  
NSLog(@"%@", str); // 打印出来是"(null)"  
str是个weak指针,所以NSString对象没有拥有者,在创建之后就会被立即释放。Xcode还会给出警告("Warning: Assigning retained object to weak variable; object will be released after assignment")