我遇到了一个奇怪的错误,如果我在闭包中检查它是否存在,那么作为我的类(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实例变量了。每当我尝试访问&#34; myObj&#34;时,无论是在课堂内部还是在课堂内部,我得到的错误都是:
EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
之前,当我有我的'myObj&#39;以前不是一个可选变量,我得到的错误是:
EXC_BAD_ACCESS (code=1, address=0x20)
我最好不想以这种方式编程,因为我一直在使用&#34; myObj&#34;在我的计划中的其他地方,它从地球表面消失,这导致了我超出这种方法的许多问题。
我已经在&#34; myObj&#34;正在设置或移动,它只在程序的其余部分被读取(并且在我制作对象后,无论我在哪里读取它都会出错)。我还检查了是否&#34; myObj&#34;在那个执行点上是零,并且它试图读取变量时出错(所以&#34; if(self.myObj)......&#34;错误)。左下角的变量资源管理器显示自己当时有一个myObj,所以我认为它也没有设置为nil。
我试过查找这两个错误。对于第二个,我只发现了几个看似无关紧要的模糊实例,而第一个似乎暗示了地址错位的一般错误。
此代码之前也曾在Xcode 6 beta 3中运行(我今天升级到4),因此它也必须是Xcode6 beta 4所做的问题/事情......任何帮助都将受到赞赏
编辑:我怀疑这是一个ARC错误,因为代码错误并不总是在同一行。出于某种原因,我怀疑PFObject正被解除引用并取消分配,即使我的班级与它有很强的联系......
答案 0 :(得分:0)
您是否尝试使用Xcode6B3?