- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 xcode 中使用内存图调试器时,我看到了一些内存泄漏。 Backtrace 没有直接链接到我的任何代码,而是通过跟踪猜测它的保存以假设它与组合和一些 DataTaskPublisher 相关。
接下来我检查了 Instruments 内部,在那里我也看到了一些内存泄漏。所有泄漏都在堆栈跟踪中提到“专门的静态 UIApplicationDelegate.main()”,但它并没有真正链接到可能导致内存泄漏的东西。
删除负责从 API 加载数据的 ViewModel 可以消除泄漏。内存图调试器显示了一个 dataTaskPublisher,所以这有点道理。
import Foundation
import Combine
enum API {
static func games() -> AnyPublisher<[GameResult], Error> {
let requestHeaderGames = gamesRequest()
return URLSession.shared.dataTaskPublisher(for: requestHeaderGames)
.map(\.data)
.decode(type: [GameResult].self, decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
private static func gamesRequest() -> URLRequest {
let url = URL(string: "http://localhost:8080/api/games")!
var requestHeader = URLRequest.init(url: url)
requestHeader.httpBody =
"filter ..."
.data(using: .utf8, allowLossyConversion: false)
requestHeader.httpMethod = "POST"
requestHeader.setValue("application/json", forHTTPHeaderField: "Accept")
return requestHeader
}
}
struct GameResult: Decodable, Identifiable, Equatable, Hashable {
let id: Int
// ...
}
final class ViewModel: ObservableObject {
@Published private(set) var games: [GameResult] = []
private var subscriptions = Set<AnyCancellable>()
public func unsubscribe() -> Void {
subscriptions.forEach {
$0.cancel()
}
subscriptions.removeAll()
}
func load() -> Void {
API.games()
.sink(receiveCompletion: { _ in }, receiveValue: { [weak self] results in
self?.games = results
})
.store(in: &subscriptions)
}
}
我已经花了很多时间来弄清楚是什么导致了这个泄漏,但我比其他任何事情都更困惑。 CFString 不是我使用的任何东西。我也无法找出为什么我的代码似乎导致了这种泄漏。
最佳答案
您发布的第一张图片似乎表明这是解码器发布商的问题。我会尝试几个不同的场景,看看我们是否可以通过解码来隔离问题:
enum API {
static var fakeGameData: Data {
let encoder = JSONEncoder()
return try! encoder.encode(fakeGames)
}
static var fakeGames: [GameResult] {
return [GameResult(id: 0), GameResult(id: 2), GameResult(id: 3)]
}
static func gamesFromData() -> AnyPublisher<[GameResult], Error> {
return Just(fakeGameData)
.decode(type: [GameResult].self, decoder: JSONDecoder())
.mapError({ $0 as Error })
.eraseToAnyPublisher()
}
static func gamesFromArray() -> AnyPublisher<[GameResult], Error> {
return Just(fakeGames)
.mapError({ $0 as Error })
.eraseToAnyPublisher()
}
}
看看如果您订阅 API.gamesFromData() 会发生什么。如果您仍然看到泄漏,则可能是解码器的问题。如果没有,那么您很有可能在 dataTaskPublisher 上遇到问题。
关于Swift Combine - CFString(存储)内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64617423/
如何编译它? 在此函数的第二行: func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWi
我使用此代码获取 ABPerson 的姓氏 CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABP
我想在子函数中为 CFString 分配空间。像这样: void fun(CFStringRef *ref) { ref = CFStringCreateWithCString(NULL, "
我正在为 iPhone 开发应用程序,遇到了一些内存管理问题。在应用程序执行期间,事件字节数不断增加而不受限制。我试图在我的代码中找出问题,但似乎找不到任何会导致事件字节数急剧增加的东西。我在执行过程
不知何故,下面的代码使我的应用程序崩溃: NSString *filename = [NSString stringWithFormat:@"%@%@", dbPath, @"BAR"]; NSStr
我正在开发的一个应用程序在 iPhone 上运行时不断崩溃,但在模拟器上却没有(尽管在没有符号 malloc_error_break 的情况下运行时会显示警告,但该应用程序在 Sim 上仍然运行) 我
我想知道一个字符串是否是单字节编码。 CFShowStr 可以完成这项工作,但它将消息输出到控制台。 CFShowStr 函数输出消息如下所示,IsEightBit 项就是我想要的: Length 7
我有一个CFMutableDictionaryRef ,调试器中的部分内容是: "device-id" = ; model = ; "vendor-id" = ; 现在我可以获得 key model
我正在应用程序上运行仪器。根据仪器,未检测到任何泄漏。 但是,类别CFString (store) 一直在上升。有谁知道 CFString (store) 是什么? 这是否意味着我有泄漏? 最佳答案
我看过问答 here about the self keyword in Swift . 但是,对我来说,这并不能解释在 this question 的以下代码片段中使用 .self let attr
我有以下代码将 String 转换为 CFString 和 backwarts: string path = @"C:\Users\ayi\Desktop\Failed\AngryBirds.ipa"
在 xcode 中使用内存图调试器时,我看到了一些内存泄漏。 Backtrace 没有直接链接到我的任何代码,而是通过跟踪猜测它的保存以假设它与组合和一些 DataTaskPublisher 相关。
首先,这与古代技术有关。我正在处理的程序端口在 Metrowerks Codewarrior 9 中维护,目标是 PPC。 用于 MSL C 的 FSRefParentAndFilename_fope
这个问题在这里已经有了答案: NSString is exactly the same as CFString? (1 个回答) 关闭 9 年前。 我没有理解 iOS 中 CFString 和 NS
我很快就开始使用 Cocoa 编程 Mac OS X 应用程序,所以这确实是一个新问题。为此事道歉。 首先我的代码片段: - (id)tableView:(NSTableView *)tableVie
自 Swift 2 起,可以从 Swift 调用采用 C 回调的 C 函数,而无需中间包装器。 许多 C 事件处理 API 都遵循首先创建上下文的模式: struct Context { CF
我正在尝试掌握在 Mac OS X 中使用 JNA 的窍门。我想访问 Carbon 库,但 Cocoa 没有对应的库,因此 Rococoa 无法帮助我(我认为...) 当我尝试调用需要 CFStrin
我有一个返回 CFString 的库,我试图在 C# 中获取该字符串值。问题是我不知道如何在 C# 中执行此操作。 使外部函数返回 CFString 将不起作用,因为它会引发异常“传递给非托管代码的类
我正在解决我的 iPad 应用程序中的一些内存分配问题,并且花了很长时间观察 CFString 在zombies instrument,直到我切换到 Leaks or allocations inst
我最近更新到 Xcode 6.1 以便能够与 iOS 8.1 一起工作,但现在我的最新项目面临错误。 对于以下行,我收到错误消息“CFString!不符合协议(protocol) Hashable”:
我是一名优秀的程序员,十分优秀!