为了账号安全,请及时绑定邮箱和手机立即绑定

iOS 开发 issue:一个assign 和 weak 的 实例分析

iOS 开发 issue:一个assign 和 weak 的 实例分析

ibeautiful 2019-05-23 16:18:30
iOS开发,使用Objective-C,属性前面用assign和weak修饰。使用assign修饰对象,会导致野指针。因为assign修饰的对象销毁后,refence没有置为nil.我同事写了很多这样的代码,为什么App运行好好的,从来没有Crash?@interfaceZBStoreInfoVC:UIViewController@property(nonatomic,assign)iddelegate;@endiddelegate一般赋给另外一个UIViewController,是对象。不是值类型
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

1.这么写肯定是会不对的,会崩溃。稍微写个小测试,确实会奔溃。
Book*book=[[Bookalloc]init];
{//从作用域出去后store就会释放
Store*store=[[Storealloc]init];
book.delegate=store;
}
[booktest];
.....
-(void)test{
NSLog(@"booktest");
if([self.delegaterespondsToSelector:@selector(testDelegate)]){
[self.delegatetestDelegate];
}
}
2.为什么没出现奔溃?可能是delegate很少优先于self释放,可能delegate因为其他原因没释放(单例或者引用循环等)。一般来说被委托者应该在更深的层级,会先释放,比如界面A->B->C,这样情况,肯定是C作为B的委托,C会先于B释放。这个问题你逐个的检查一下为什么没有奔溃。主要看:是否delegate释放了还回去调用self.delegate之类的。
                            
查看完整回答
反对 回复 2019-05-23
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

使用weak修饰时,当属性所指向的对象内存引用计数为0时会自动赋值为nil,而assign则不会.所以当assign修饰的delegate指向的对象dealloc(内存释放)后,再去访问deleagte系统会奔溃
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 619 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信