我正在使用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) 我尝试给我的UITableViewCell类一个自定义的启动器,但我无法弄清楚我做错了什么.
这是我的代码:
init(dataObject: [NSManagedObject]!, objectAttributeValues: [String]!,placeholder: String!, segmentedControl: UISegmentedControl?, cellHeight: CGRect, cellWidth: CGRect) {
self.dataObject = dataObject
self.Placeholder.text = placeholder
self.objectAttributeValues = objectAttributeValues
if segmentedControl != nil {
self.segmentedControl = segmentedControl!
didHaveSegmentedControl = true
}
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
Run Code Online (Sandbox Code Playgroud)
我试着调用super.init(frame:CGRect(...))但是通过实现这个我得到另一个错误:必须调用超类"UITableViewCell"的指定初始化器
我能做什么?非常感谢!
"更新帧"调用通常在Xcode中显示为灰色
我知道更新帧以匹配您的约束的唯一方法是,繁琐地选择最高级别的视图,并且(有时)您可以在菜单栏中捕获"选定视图" - >"更新帧".此外,"所有视图" - >"更新框架"似乎通常根本无法工作或以我无法理解的方式工作.
当然只有一个按键或按钮可以直接更新所有帧以匹配任何新输入的约束(例如使用control-drag进行的约束).
当然有人对此有一些想法.一个人在Xcode中不断使用它!赏金!
注意..对于2016年,您可以使用这个非常方便的按钮,通过在菜单栏菜单中搜索,至少可以显示相同的子菜单.
然而,看起来(参见下面的ZaBlanc的评论)可能实际上存在Xcode错误,并且您无法为"所有视图"项目分配击键.(你经常使用的那些.)
他们似乎已经删除了'更新框架'选项 ... WTH
我想使用Xcode Version 7.0.1将基于HTML的网站捆绑为iPhone应用程序,一切正常,我唯一的问题是,当我在iPhone 4s上测试应用程序时,它不会显示通过访问的图像http.但是,我可以访问另一个提供https其图像访问权限的网站的图像.
有没有办法为捆绑添加http支持?
更新
我NSExceptionDomains在我的plist文件中添加了一个,但我仍然有同样的问题
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>My Project</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIcons</key>
<dict/>
<key>CFBundleIcons~ipad</key>
<dict/>
<key>CFBundleIdentifier</key>
<string>com.myproject.names</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>1.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.1</string>
<key>CFBundleSignature</key>
<string>myproject</string>
<key>CFBundleVersion</key>
<string>1.1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIMainStoryboardFile</key>
<string>Main_iPhone</string>
<key>UIMainStoryboardFile~ipad</key>
<string>Main_iPad</string>
<key>UIRequiresFullScreen</key>
<string>YES</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSAppTransportSecurity</key>
<dict> …Run Code Online (Sandbox Code Playgroud) XCode 7 Playground支持游乐场资源.如果我的资源中有GameScene.png,那么当我在我的资源或NSImage(名为:"GameScene.png")中有GameScene.sks时,我可以获得SKScene(fileNamed:"GameScene").
但是如何从Playground资源中读取文本文件?
我知道这个问题与内存分配有关,但我只在iOS 9,XCode 7中得到它.在XCode 6.4,iOS 8.4中,它工作得很完美,在任何方面都没有问题.在iOS 9,XCode 7中,它只是经常崩溃而产生此错误.
malloc: *** mach_vm_map(size=1048576) failed (error code=3)
*** error: can't allocate region securely
*** set a breakpoint in malloc_error_break to debug
有什么建议?我正在处理内存问题,但我想知道是否存在太多内存问题,那么为什么它在iOS 8.4中工作而在iOS 9中不起作用?
另外,我把所有的UI都搞砸了!就像导航栏没有标题一样,自定义标签栏(RDVTabBar)不可见,但是,其他视图控制器就在那里(它响应触摸事件,您可以点击该区域,并且位于该区域的按钮起作用!).
PS我没有得到内存警告,也没有applicationWillTerminate:调用任何方法!
更新:我发现此问题仅发生在iPhone 5和4s中!(非64位设备!)
更新2:当崩溃发生时,我尝试打印其中一个对象并打印它,我再次在调试模式下得到相同的错误:
malloc: *** mach_vm_map(size=1048576) failed (error code=3)
*** error: can't allocate region securely
*** set a breakpoint in malloc_error_break to debug.
------------------更新------------------
好吧,我在这里找到了一些东西:我在仪器中检查了我的应用程序并检测到它在iOS 8.4中占用了大约200mb的内存,而且令人惊讶的是iOS 9.*占用了1.5 GB的内存!这是我不明白的事情!一个应用程序在iOS 8.4中占用200 MB的内存,同一个应用程序在iOS 9上占用超过1.5GB的内存!根本不可理解!任何的想法?
我的一个屏幕有多个文本字段,我可以从不同的其他屏幕登陆到这个屏幕.在每种情况下,我将一个或另一个文本字段作为第一响应者.我无法编写测试来确定所需的textField是否具有焦点.
当我在控制台中打印文本字段时 -
输出:{TextField 0x131171d40:traits:146031247360,Focused,{{ 6.0,108.3 },{402.0,35.0}},value:}
但我在XCUIElement上找不到任何focus/isFocus属性.
有没有办法实现这个目标?
我有一个可以从http域下载一些信息的应用程序.但是在Swift 2.0和Xcode 7更新之后,我的应用程序无法连接到服务器并下载json数据,我得到"App Transport Security已经阻止了一个明文HTTP(http://)资源加载,因为它不安全.可以通过应用程序的Info.plist文件配置临时例外." 错误.
我试过把这些行放在我的info.plist中:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
但我得到同样的错误,它不起作用.我总是从下载方法中获取nil数据.任何人都有同样的错误?谢谢!
编辑:这是我的info.plist文件中的图片:
我正在运行Xcode 7.3.1.在构建基于Swift的项目时,它会挂起"编译Swift源文件".我已经尝试了删除DerivedData,清理,运行,重新启动Xcode,重新启动OS X的各种组合,似乎没有工作.有任何想法吗?
xcode7 ×10
ios ×8
xcode ×5
swift2 ×3
ios9 ×2
swift ×2
autolayout ×1
http ×1
ios8.4 ×1
json ×1
macos ×1
malloc ×1
memory-leaks ×1
plist ×1
ui-testing ×1
uitableview ×1
xcode6.4 ×1