返回信息流现在使用的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怎么理解?
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #23653同步于 2015/7/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
[问题]关于__weak问题的请教(解决)
hsf143
2015/7/17镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
初始化的时候应该先alloc 再init或者直接new。不知道是不是我手机看的乱码,我看你代码里直接init
【 在 hsf143 的大作中提到: 】
最近在回顾iOS一些基础问题,看到__weak那里有点...
估计是你手机看的原因,__weak我知道怎么用?但是不清楚UILbel和UITextView对于text这个属性的封装是什么样的。对NSString的copy,都是浅复制,但是相同的代码只是把UILabel换成UITextView就不一样,感觉很费解。
【 在 aksusanoh 的大作中提到: 】
: 初始化的时候应该先alloc 再init或者直接new。不知道是不是我手机看的乱码,我看你代码里直接init
最近在回顾iOS一些基础问题,看到__weak那里有点...
这个问题我还没完全搞懂,不过也有暂时能解决一些,过两天从书里看看再给你完整的解答。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的第二种情况是为什么呢?我也没搞明白,过两天有时间我再好好看看书。稍后回寝室放一些说明的代码。
发自「贵邮」
【 在 hsf143 的大作中提到: 】
: 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器)
: #import "ViewController.h"
: @interface ViewController ()
: ...................
如图在mrc环境下:
,证明了label.text是个常量,而textVIew.text是一个一般对象
【 在 hsf143 的大作中提到: 】
: 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器)
: #import "ViewController.h"
: @interface ViewController ()
: ...................
又在arc环境下:
,由于viewDidLoad和ViewWillAppear是在同一个runloop中,所以autorelease的变量未被释放,而viewDidAppear属于另一个runloop,textView.text已被释放,但是label.text会一直存在。
【 在 hsf143 的大作中提到: 】
: 最近在回顾iOS一些基础问题,看到__weak那里有点疑惑具体代码如下(xcode6.3.1,ip6 模拟器)
: #import "ViewController.h"
: @interface ViewController ()
: ...................
补一张arc下的属性声明。。。
我觉得咱们理解有点出入。。我感觉和深浅复制也有点关系。当然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的第二种情况是为什么呢?我也没搞明白,过两天有时间我再好好看看书。稍后回寝室放一些说明的代码。
: 发自「贵邮」