IOS开发入门之Weak 和 Strong
白羽 2018-09-07 来源 :网络 阅读 1147 评论 0

摘要:本文将带你了解IOS开发入门之Weak 和 Strong,希望本文对大家学IOS有所帮助。

        本文将带你了解IOS开发入门之Weak 和  Strong,希望本文对大家学IOS有所帮助。


  
   介绍:
ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
注意:ARC 是编译器特性,而不是 ios 运行时特性(除了weak指针系统),它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。
 
原理:
ARC 的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的。
 
一、Strong 原理:
文本输入框框属性

1 @property (nonatomic, assign) IBOutlet UITextField *nameField;

 
1.在文本框中输入mj这个字符串

那么就可以说,nameField的text属性是NSString对象的指针,也就是拥有者,该对象保存了文本输入框的内容

2.如果执行了如下代码
 

1 NSString *name = self.nameField.text;  

一个对象可以有多个拥有者,在上面代码中,name变量同样也是这个NSString对象的拥有者,也就是有两个指针指向同一个对象

3.随后用户改变了输入框的内容,比如
此时nameFeild的text属性就指向了新的NSString对象。但原来的NSString对象仍然还有一个所有者(name变量),因此会继续保留在内存中

4.当name变量获得新值,或者不再存在时(如局部变量方法返回时、实例变量对象释放时),原先的NSString对象就不再拥有任何所有者,retain计数降为0,这时对象会被释放
如,给name变量赋予一个新值

name = @"Jake";  


我们称name和nameField.text指针为"Strong指针",因为它们能够保持对象的生命。默认所有实例变量和局部变量都是Strong指针
 
二、Weak 指针
weak型的指针变量仍然可以指向一个对象,但不属于对象的拥有者
1.执行下面的代码

1 __weak NSString *name = self.nameField.text; 


name变量和nameField.text属性都指向同一个NSString对象,但name不是拥有者
2.如果文本框的内容发生变化,则原先的NSString对象就没有拥有者,会被释放,此时name变量会自动变成nil,称为空指针
weak型的指针变量自动变为nil是非常方便的,这样阻止了weak指针继续指向已释放对象,避免了野指针的产生,不然会导致非常难于寻找的Bug,空指针消除了类似的问题
 
3.weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController

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

1 __weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];  
2 NSLog(@"%@", str); // 打印出来是"(null)"  

str是个weak指针,所以NSString对象没有拥有者,在创建之后就会被立即释放。Xcode还会给出警告("Warning: Assigning retained object to weak variable; object will be released after assignment")
如:
在AppDelegate.m中

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // Override point for customization after application launch.
 3     ViewController *vc = [[ViewController alloc] init];
 4     self.window.rootViewController = vc;
 5     
 6     [self.window makeKeyAndVisible];
 7     
 8     
 9     return YES;
10 }

 
在ViewController.h中

1 #import <UIKit/UIKit.h>

3 @interface ViewController : UIViewController

5 @property(nonatomic, weak) UIView *aView;


8 @end

 
在ViewController.m中

用控制台打印:

 
2.一般的指针变量默认就是strong类型的,因此一般我们对于strong变量不加__strong修饰,以下两行代码是等价的:

1 NSString *name = self.nameField.text;  
2 __strong NSString *name = self.nameField.text;  

 
 
3.属性可以是strong或weak,写法如下
 

1 @property (nonatomic, strong) NSString *name;  
2 @property (nonatomic, weak) id delegate;  

 
 
 
 
 
 
 
 
 
 
 
 
参考资料:ARC-weak和Strong指针
 










   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved