佚名通过本文主要向大家介绍了oc,λoc显示屏亮度调整,人oc液晶显示器,oc奶粉,斯蒂卡oc等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: oc循环引用问题
描述:
解决方案1:
这段代码,编译器会将代码块中的self.ob1看作是self->ob1,block会捕获你的self而不是ob1,这个是规则。
你自身就拥有这个block作为实例变量,又在这个block中强引用self,自然就是强引用循环了。
要想改写的话,楼上说的不全面,不仅要在block外改变self为弱引用,还要防止弱引用的对象随时被释放而使用局部强引用。
不知理解了没有。。。
描述:
遇到一个问题:
这样写会导致循环引用,好理解:
self.block = ^{
NSLog(@"%@", self.ob1);
};
但是这样就obj1能正常释放了,理解不了:
BlockOb *tempOb = self.ob1;
self.block = ^{
NSLog(@"%@", tempOb);
};
谁帮忙解析一下!(BlockOb是继承NSobject,仅重写了dealloc, ob1时BlockOb对象)
解决方案1:
没有在block块内部声明的变量对于block来说都叫做外部变量,对于外部变量,如果是常量,在运行block块的时候会直接将值拷贝过来,如果是对象,block会使用强引用直接捕获这个对象,即拥有了这个对象。
self.block = ^{
NSLog(@"%@", self.ob1);
};
这段代码,编译器会将代码块中的self.ob1看作是self->ob1,block会捕获你的self而不是ob1,这个是规则。
你自身就拥有这个block作为实例变量,又在这个block中强引用self,自然就是强引用循环了。
要想改写的话,楼上说的不全面,不仅要在block外改变self为弱引用,还要防止弱引用的对象随时被释放而使用局部强引用。
__weak Class * weakSelf = self;
self.block = ^{
Class * innerSelf = weakSelf;
NSLog(@"%@", self.ob1);
};
不知理解了没有。。。
您可能想查找下面的文章:
- 真机测试,clang:error:linkercommandfailedwithexitcode1use-vtoseeinvocat
- iOS,我在Githubfork别人的仓库后更改了代码,可以用CocoaPods把我的仓库加入项目里吗?
- iOS支持“用其他应用打开”,plist中设置DocumentTypes为哪种类型可以同时支持doc/docx?<UTIs>
- [selfimageUrlArrayenumerateObjectsUsingBlock:,这句代码是是做什么用的?
- 为什么有的书说在初始化方法和dealloc方法总是应该通过实例变量来读写数据?
- 一句oc代码转成swift
- ocr软件ios-OCR-Tesseract
- display:inline-block类方法中使用了block,如何避免循环引用?
- WEEXstorage模块在iOS端setItem失败
- 关于GCDAsyncUdpSocket接受到数据后address参数怎么转码成服务器ipip