- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Swift 中用指针做了一些测试,想验证我接受指针的对象没有被保留。
func test1(){
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeUnretainedValue();
print(CFGetRetainCount(str2))
}
结果是 2,2,3。所以“passUnretained”没有保留,但是“takeUnretainedValue”保留了。
更改为“takeRetainedValue”可解决问题,并导致预期的崩溃。输出 2,2,2。
func test1(){
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeRetainedValue();
print(CFGetRetainCount(str2))
}
因此,总而言之,“takeRetainedValue”不保留值。
更新:我编辑了这个问题以删除一些以前令人困惑的陈述并将其返回到一个基本的编程问题。
最佳答案
实际上,“takeUnretainedValue”并没有保留值,而是在返回值后由赋值本身完成的。
我测试发现,只要“passRetained”和“takeRetained”一起使用,“passUnretained”和“takeUnretained”一起使用,那么这个变量就不会泄漏,只是因为新添加的变量+1。
func test1() -> UnsafeMutableRawPointer {
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passRetained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeRetainedValue();
print(CFGetRetainCount(str2))
print(str2);
print("111");
print(str.b)
return ptr1;
}
let ptr4 = test1();
let str4 = Unmanaged<aaa>.fromOpaque(ptr4).takeUnretainedValue();
print(CFGetRetainCount(str4))
print(str4.b);
这是一个测试,表明 takeUnretainedValue 不会增加引用计数(删除了赋值,但仍然调用了该函数)。
func test1() {
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
Unmanaged<aaa>.fromOpaque(ptr1).takeUnretainedValue();
print(CFGetRetainCount(str))
//print(str2);
print("111");
print(str.b)
}
类似的测试表明“takeRetainedValue”会减少保留计数。它指的是来自 passRetained 的“额外保留”,并返回它开始时的值。如果已分配,它也会获得 +1。
关于swift - 为什么 Swift "Managed.fromOpaque.takeUnretainedValue()"保留值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41773350/
互联网上的很多帖子都说我可以使用以下代码返回未保留的图像源: let imageData1 = image.TIFFRepresentation let source1 = CGImageSource
我正在使用 AVFoundation 在 iOS 上拍摄方形照片的应用程序。当我在 photoOutput(_:, didFinishProcessingPhoto:, error:) 中使用以下语句
我正在尝试在前端语言中使用 Swift,在后端语言中使用 Python 来实现基于套接字的聊天应用程序。我按照教程 http://www.raywenderlich.com/3932/networki
takeUnretainedValue 和 takeRetainedValue 有什么区别?基于 Apple 的文档: Both of these methods return the origina
那是我在 swift 1.2 中的代码 let record = attendee.ABRecordWithAddressBook(addressBookController.adbk)! let u
我在 Swift 中用指针做了一些测试,想验证我接受指针的对象没有被保留。 func test1(){ let str = aaa(); print(CFGetRetainCount(
根据 Using Swift with Cocoa and Objective-C你可以使用 takeUnretainedValue() 和 takeRetainedValue() 来告诉 Swift
我正在使用this approach将我的字符串常量保持在一起。使用该帖子中的相同示例: MONExtResult.h struct MONExtResultStruct { __unsafe
我正在开发一个 Swift 项目,该项目使用封装在 C++ 中的 C 库。 该库为您提供了同步和异步获取/设置变量的可能性。 库作为回调方法通知何时甚至已经发生。 我在 swift 中有这个功能: /
我有几个 UIView 或 UITableViewCell。里面我有 C 回调,例如: CCallback(bridge(self), {(observer, data) -> Void
我是一名优秀的程序员,十分优秀!