BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #23653同步于 2015/7/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

[问题]关于__weak问题的请教(解决)

hsf143
2015/7/17镜像同步10 回复
现在使用的Xcode7.3.1测试,已经没有问题了,不会出现NULL的问题 ———————————————————————————————————————————————— 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器) #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UITextView *textView = [[UITextView alloc]init]; textView.text = @"Test1"; __weak NSString * test ; test= textView.text; NSLog(@"%@",test); textView.text = @"test3"; NSLog(@"%@",test); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 打印的结果是这样: 改前:Test1 改后:Test1 我想这应该是: 改前:Test1 改后:(null) 于是又改了下代码: - (void)viewDidLoad { [super viewDidLoad]; UITextView *textView = [[UITextView alloc]init]; textView.text = @"Test1"; __weak NSString * test = textView.text; // test= textView.text; NSLog(@"改前:%@",test); textView.text = @"test3"; NSLog(@"改后:%@",test); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } 结果打印结果是这样的: 改前:(null) 改后:(null) 感觉难道和UITextView有关么?于是又换成这样: #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UILabel *textView = [[UILabel alloc]init]; textView.text = @"Test1"; __weak NSString * test = textView.text; //test= textView.text; NSLog(@"改前:%@",test); textView.text = @"test3"; NSLog(@"改后:%@",test); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 打印结果是这样: 改前:Test1 改后:Test1 这真心晕了,求教大家对于__weak怎么理解?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
aksusanoh机器人#1 · 2015/7/17
改前和改后到底改什么? 【 在 hsf143 的大作中提到: 】 最近在回顾iOS一些基础问题,看到__weak那里有点...
aksusanoh机器人#2 · 2015/7/17
__weak就是申明一个弱指针 【 在 hsf143 的大作中提到: 】 最近在回顾iOS一些基础问题,看到__weak那里有点...
aksusanoh机器人#3 · 2015/7/17
初始化的时候应该先alloc 再init或者直接new。不知道是不是我手机看的乱码,我看你代码里直接init 【 在 hsf143 的大作中提到: 】 最近在回顾iOS一些基础问题,看到__weak那里有点...
hsf143机器人#4 · 2015/7/18
估计是你手机看的原因,__weak我知道怎么用?但是不清楚UILbel和UITextView对于text这个属性的封装是什么样的。对NSString的copy,都是浅复制,但是相同的代码只是把UILabel换成UITextView就不一样,感觉很费解。 【 在 aksusanoh 的大作中提到: 】 : 初始化的时候应该先alloc 再init或者直接new。不知道是不是我手机看的乱码,我看你代码里直接init 最近在回顾iOS一些基础问题,看到__weak那里有点...
h1050311695机器人#5 · 2015/7/18
这个问题我还没完全搞懂,不过也有暂时能解决一些,过两天从书里看看再给你完整的解答。uitextview.text是一个对象,而uilabel.text是一个常量的nsstring。在mrc环境下可以看到[textview.text retainCount]是1,[label.text retainCount]是一个极大值,在effective objc里说,编译器会将局部变量nsstring,nsnumber用常量表达式定义的,如nsstring *string = @“text”,等转化成常量对象,因为这些都是不会改变的,从而达到优化。__weak指针实在对象释放时置为nil,常量对象存在于整个程序运行时,所以第三种uilabel情况就是这样解释,因为label是一个显示的控件text变化不多,随意苹果底层实现为常量(个人猜测),uitextview的内容变化频繁,所以text只是一个一般对象。而为什么第一种情况里第二个输出不是nil呢?是因为在赋值给test的时候,将uitextview.text注册到了autorelease自动释放池,会延迟他的释放,所以第二个输出也不是nil。至于lz的第二种情况是为什么呢?我也没搞明白,过两天有时间我再好好看看书。稍后回寝室放一些说明的代码。 发自「贵邮」
h1050311695机器人#6 · 2015/7/18
【 在 hsf143 的大作中提到: 】 : 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器) : #import "ViewController.h" : @interface ViewController () : ................... 如图在mrc环境下: ,证明了label.text是个常量,而textVIew.text是一个一般对象
h1050311695机器人#7 · 2015/7/18
【 在 hsf143 的大作中提到: 】 : 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器) : #import "ViewController.h" : @interface ViewController () : ................... 又在arc环境下: ,由于viewDidLoad和ViewWillAppear是在同一个runloop中,所以autorelease的变量未被释放,而viewDidAppear属于另一个runloop,textView.text已被释放,但是label.text会一直存在。
h1050311695机器人#8 · 2015/7/18
【 在 hsf143 的大作中提到: 】 : 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器) : #import "ViewController.h" : @interface ViewController () : ................... 补一张arc下的属性声明。。。
hsf143机器人#9 · 2015/7/19
我觉得咱们理解有点出入。。我感觉和深浅复制也有点关系。当然UILabel还有UITextField UITextView的text属性的实现也有关系。可以加个qq讨论下么 【 在 h1050311695 的大作中提到: 】 : 这个问题我还没完全搞懂,不过也有暂时能解决一些,过两天从书里看看再给你完整的解答。uitextview.text是一个对象,而uilabel.text是一个常量的nsstring。在mrc环境下可以看到[textview.text retainCount]是1,[label.text retainCount]是一个极大值,在effective objc里说,编译器会将局部变量nsstring,nsnumber用常量表达式定义的,如nsstring *string = @“text”,等转化成常量对象,因为这些都是不会改变的,从而达到优化。__weak指针实在对象释放时置为nil,常量对象存在于整个程序运行时,所以第三种uilabel情况就是这样解释,因为label是一个显示的控件text变化不多,随意苹果底层实现为常量(个人猜测),uitextview的内容变化频繁,所以text只是一个一般对象。而为什么第一种情况里第二个输出不是nil呢?是因为在赋值给test的时候,将uitextview.text注册到了autorelease自动释放池,会延迟他的释放,所以第二个输出也不是nil。至于lz的第二种情况是为什么呢?我也没搞明白,过两天有时间我再好好看看书。稍后回寝室放一些说明的代码。 : 发自「贵邮」