【发布时间】:2014-07-22 21:16:48
【问题描述】:
我遇到了一个奇怪的错误,如果我在闭包中检查它是否存在,作为我的类 (ImagePostStructure) 的实例变量的 PFObject 会奇怪地不存在。此外,通过闭包内部的外部变量对该变量进行引用将在运行时解决该问题,但 PFObject 实例 var 仍然会消失并且以后根本无法访问。
以下是我的类中初始化 PFObject 的相关部分:
class ImagePostStructure {
var myObj: PFObject?
var image: UIImage?
...other variables...
init(inputObj: PFObject) {
//called when retrieving object (for viewing, etc)
myObj = inputObj;
...
}
下面是同一个类中的一个方法,我从我的 PFObject 加载图像文件。
func loadImage(finishFunction: (imgStruct: ImagePostStructure, index: Int)->Void, index: Int) {
if (!image) {
var imgFile: PFFile = myObj!["imageFile"] as PFFile;
//comment immediate line below
var obj = self.myObj; //<----setting an external reference for my closure
imgFile.getDataInBackgroundWithBlock( { (result: NSData!, error: NSError!) in
if (!error) {
//get file objects
self.image = UIImage(data: result);
NSLog("This runs: \(self)");
//comment immediate line below
NSLog("This also runs \(obj)"); //<----commenting this causes error
NSLog("This does NOT run if above is NOT commented \(self.myObj!)");
NSLog("This does NOT run if above is NOT commented \(self.myObj!.objectId)");
finishFunction(imgStruct: self, index: index);
}
});
}
else {
finishFunction(imgStruct: self, index: index);
}
}
如果我在 NSLog 中注释引用 PFObject 实例变量的行,那么我将无法再从 self 访问 PFObject 实例变量。每当我尝试从类内部或外部访问“myObj”时,我得到的错误是:
EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
之前,当我让我的 'myObj' 不是可选变量之前,我得到的错误类似于:
EXC_BAD_ACCESS (code=1, address=0x20)
我最好不要以这种方式编程,因为我一直在我的程序中的其他地方使用“myObj”,它从地球上消失给我带来了这种方法之外的许多问题。
我已经对设置或移动“myObj”的位置进行了文本搜索,并且仅在程序的其余部分中读取它(并且在我制作对象后在任何地方读取它时都会出错)。我还检查了“myObj”在执行时是否为 nil,并且在尝试读取变量时出错(因此“if (self.myObj)...”出错)。左下角的变量 explorer 显示 self 当时有一个 myObj 所以我不认为它被设置为 nil 。
我已尝试查找这两个错误。对于第二个,我只发现了一些看起来无关紧要的晦涩实例,而第一个似乎暗示了地址未对齐的一般错误。
此代码之前在 Xcode 6 beta 3 中也有效(我今天升级到 4),所以它也一定是 Xcode6 beta 4 所做的问题/事情...任何帮助将不胜感激
编辑:我怀疑这是一个 ARC 错误,因为代码错误并不总是在同一行。出于某种原因,我怀疑 PFObject 正在被取消引用和取消分配,即使我的类与它有很强的联系......
【问题讨论】:
-
我不知道这是否是您的错误的原因,但您在闭包中使用了对
self的非弱引用,这将导致强引用循环,如此处所述:developer.apple.com/library/prerelease/ios/documentation/Swift/…
标签: ios swift parse-platform xcode6