我正在使用Swift 2(Xcode 7 beta 3)开发一个应用程序,我试图在可能的情况下使用值类型(结构和枚举).根据Apple关于内存管理的文档,使用值类型不应该导致任何保留周期,它应该正常工作.
但是今天我在事件处理代码中遇到了大量的内存泄漏.我追踪它并将问题减少到以下最小的例子.
假设有一个Item定义单个属性的协议value:
protocol Item {
var value: String { get }
}
Run Code Online (Sandbox Code Playgroud)
然后,我们创建一个实现Item协议的具体结构,并添加一个额外的属性additionalValue.我们来调用结构FooItem.
struct FooItem<T>: Item {
let value: String
let additionalValue: T
init(value: String, additionalValue: T) {
self.value = value
self.additionalValue = additionalValue
}
}
Run Code Online (Sandbox Code Playgroud)
拼图的第三部分是另一个包含实现Item协议的项目的结构.它被称为ItemWrapper.
struct ItemWrapper {
let item: Item
init(item: Item) {
self.item = item
}
}
Run Code Online (Sandbox Code Playgroud)
如果使用Memory Leaks配置在Instruments中进行分析,则每次ItemWrapper使用a创建值时都会出现内存泄漏FooItem.
let item = FooItem(value: …Run Code Online (Sandbox Code Playgroud) 我\xe2\x80\x99在 SwiftUI 中遇到了与工作表演示相关的令人费解的行为。关闭工作表时,我注意到关联的实例(工作表\xe2\x80\x99s 视图持有的视图模型)don\xe2\x80\x99t 似乎已正确取消初始化。
\n根据我的测试,唯一deinit按预期被调用的场景是使用@StateObject. 相反,@ObservedObject新@Observable宏 don\xe2\x80\x99t 似乎都会触发调用deinit。
下面,我\xe2\x80\x99ve提供了一组展示各种场景的示例。每个尝试以不同的方式提供视图模型。要测试解雇,您只需在显示的工作表上向下滑动即可:
\nimport SwiftUI\n\n// ============================================================================ //\n// MARK: - App\n// ============================================================================ //\n\n@main\nstruct SwiftUISheetDeinitIssueApp: App {\n var body: some Scene {\n WindowGroup {\n CaseA_ContentView()\n }\n }\n}\n\n// ============================================================================ //\n// MARK: - Case A: @StateObject (Works!)\n// ============================================================================ //\n\nstruct CaseA_ContentView: View {\n @State var isPresented = false\n \n var body: some View {\n Button("Show Sheet") {\n self.isPresented = true\n }\n .sheet(isPresented: $isPresented) {\n CaseA_SheetView()\n …Run Code Online (Sandbox Code Playgroud) 我工作的iOS应用程序,它允许下载和HTTP实时流的私人视频.视频存储在Amazon S3存储桶中(mp4作为m3u8/ ts文件分段).此外,CloudFront已打开并连接到存储桶.
由于内容是私有的,因此我需要在通过CloudFront连接时对URL进行签名.为了对URL进行签名,必须使用私钥,因此,如果不将私钥存储在捆绑包中,则无法在iOS应用程序中生成签名URL.这将是个坏主意!
所以我决定编写一个简单的Ruby服务器,它执行URL签名并重定向到生成的签名CloudFront URL,如下所示:
HTTP://signing.server.local/videos/1.mp4 →交通 https://acbdefg123456.cloudfront.net/videos/1.mp4??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX
HTTP://signing.server.local/videos/1.m3u8 →交通 https://acbdefg123456.cloudfront.net/videos/1.m3u8??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX
对于视频下载,它运行良好,因为只有一个请求.但是,当我希望流式传输内容并提供MPMoviePlayerController签名服务器的URL时,服务器只会签署第一个请求并重定向到CloudFront.对于下一个请求,MPMoviePlayerController将第一个签名的CloudFront URL作为基础并尝试直接连接而不会抛出签名服务器.
m3u8文件中的路径是相对的.
有关如何实现此功能而无需通过签名服务器发送所有内容的任何建议?
video mpmovieplayercontroller http-streaming ios amazon-cloudfront
在Objective-C中,有一种方法可以声明符合类和一组协议的变量,如下所示:
BaseClass<Protocol1, Protocol2> *variable = ...
Run Code Online (Sandbox Code Playgroud)
在Swift中,我想声明一个数组(实际上是一个类的属性),其中包含由此模式定义的类型的元素.
在这个问题中,有一个解决方案,通过使类通用并相应地约束类型来描述独立属性的类型.为了实例化这样的类,有必要指定确切的类型.这对于独立属性来说不是问题,但在数组中应该可以存储具有不同确切类型的元素.
有没有办法在Swift中表达这个?
所有那些"NSOrderedSet后来被添加,因此不必与其他组件一起玩"错误让我发疯...
我有两个托管对象和它们之间有序的1:N关系,它由一个实例(或更精确的子类)支持NSOrderedSet.我想使用a来管理这种关系NSArrayController,以便从它提供的功能中获益(选择管理,内容绑定,视图绑定等NSTableView).
由于NSOrderedSet不是子类NSSet,contentSet绑定NSArrayController不适用于该关系.我发现了以下主题并试图实现那里提到的建议.
第一个建议是使用contentArray绑定和值转换器将有序集转换为数组.这个解决方案的问题是每次进行更改时重新分配内容,这不是我想要的.
在提到的线程中提供的第二个建议是使用contentArray绑定并将@array操作符应用于模型密钥路径.我已经尝试过,但是当通过添加/删除对象时根本没有触及底层关系NSArrayController.
我发现的另一个选项是使用带contentSet绑定的排序描述符.这将需要使关系无序,以便使contentSet绑定工作并引入特别用于管理订单的新属性.这还需要一个自定义排序机制来实现,它会搞砸模型.老实说,我想避免这个解决方案.
我的问题很清楚:有没有办法管理有序的核心数据关系NSArrayController?如果是这样,哪种方法尽可能少引起疼痛?
cocoa core-data nsarraycontroller cocoa-bindings nsorderedset
从Objective-C 2.0开始,我们有了一个属性,一个很好的语法来获取和设置实例变量的值.由于Clang 3.1所有非动态的属性,不具有显式getter的readonly或没有自定义getter和setter,都会自动合成到ivars.而且,由于ARC,我们对属性使用弱/强注释,ARC使用它来定义自动合成属性的内存管理逻辑.
例如,属性仍然可以手动合成,例如用于由ivar支持的只读属性并返回默认值.
有时,如果它们根本不合成,那么它们也很有用.当我使用这种行为时,我发现了一些用例:
NSManagedObject.问题:根据实际使用情况,用弱/强注释这些非合成属性是否有意义?什么是最佳做法?
memory-management properties objective-c ios automatic-ref-counting
我知道有 Swift REPL 和 Xcode 游乐场,但我想知道 Swift 中是否有替代方案,ruby -e "<code>"其中sh -c "<code>"给定的一行代码将作为命令的结果执行?
ios ×4
swift ×2
arrays ×1
bash ×1
cocoa ×1
core-data ×1
generics ×1
macos ×1
memory-leaks ×1
nsorderedset ×1
objective-c ×1
properties ×1
protocols ×1
swift2 ×1
swiftui ×1
terminal ×1
video ×1
xcode7 ×1