【发布时间】:2013-02-08 05:59:59
【问题描述】:
我在 A 类中有一个方法调用:
GDataXMLElement *infoElement = [self getElementFromFilePath:filePath];
NSString *testStringA = [infoElement attributeForName:@"someAttribute"].stringValue;
以及B类中的方法实现:
-(GDataXMLElement*)getElementFromFilePath:(NSString*)filePath {
NSData *xmlData = [NSData dataWithContentsOfFile:filePath];
GDataXMLDocument *infoXMLDoc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:nil];
NSArray *infoArray = [infoXMLDoc.rootElement elementsForName:@"test"];
GDataXMLElement *returnElement = (GDataXMLElement*)infoArray[0];
NSString *testStringB = [returnElement attributeForName:@"someAttribute"].stringValue;
return returnElement;
}
B 类方法末尾的returnElement 已完美初始化,testStringB 字符串包含正确的值。
但是在A类中,InfoElement的内容没有了,testStringA为nil。
我怀疑 ARC 发布 GDataXMLDocument 太早了,并且能够通过将文档绑定到 B 类中的属性来阻止这种行为:
@property (nonatomic,strong) GDataXMLDocument *infoXMLDoc;
但我对这个解决方案有点不满意。我永远不会再使用该属性,我只需要元素来解析它一次。如果可以使用属性停止发布,是否还有一种方法可以在方法中执行此操作?我尝试了这样的 __strong 限定符:
GDataXMLDocument __strong *infoXMLDoc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
但这并没有帮助。所以我的问题,假设 ARC 确实负责:
1.是否可以在方法中告诉 ARC 不释放对象?
2。我对这里的行为有什么不明白的地方?我现在使用 ARC 已经有一段时间了,这是我第一次被卡住。
【问题讨论】:
-
当您说“
InfoElement的内容消失了”时,您的意思是它分配了一个GDataXMLElement,但该对象不包含您期望的内容吗?还是说是nil? -
该代码无法编译;
getElementFromFilePath()中没有infoElement。 -
您是否关注过the instructions for adding GData to a project,包括为库文件禁用ARC?
-
木马,编辑了代码。 Jim,后者,分配了 GDataXMLElement,但 xml 内容为空。是的,GDataXMLNode 禁用了 ARC,否则无法编译。
标签: objective-c automatic-ref-counting autorelease gdataxml