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之类的。
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
使用weak修饰时,当属性所指向的对象内存引用计数为0时会自动赋值为nil,而assign则不会.所以当assign修饰的delegate指向的对象dealloc(内存释放)后,再去访问deleagte系统会奔溃
添加回答
举报
0/150
提交
取消