我在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为零。
我怀疑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一段时间了,这是我第一次被卡住了。
答案 0 :(得分:2)
GDataXMLNode.h
标题显示:
由创建文档的代码决定是否保留它一段时间 因为任何引用都依赖于该文档树中的节点。
从getElementFromFilePath
返回的节点取决于父节点(GDataXMLDocument
),但这将由ARC发布。只要您引用其中的节点和元素,必须保留GDataXMLDocument
某处。这些是GDataXML*
类的语义,您必须遵循它们。
答案 1 :(得分:0)
我无法编译所以这只是一个有根据的猜测,但我怀疑问题是你返回一个指向在方法中分配和释放的对象的指针:
GDataXMLElement *returnElement = (GDataXMLElement*)infoArray[0];
如您所见,您没有分配returnElement,因此ARC无法理解您是否需要它。当您退出方法时,它只是释放infoArray。 如果您复制该值(类似[(GDataXMLElement *)infoArray [0] copy]),它应该有效。