3

我在 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;
}

returnElement类 B 中方法末尾的 已完美初始化,并且字符串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 有一段时间了,这是我第一次被卡住。

4

2 回答 2

2

标题GDataXMLNode.h说:

只要任何引用依赖于该文档树内的节点,就由创建文档的代码来保留它。

您返回的节点getElementFromFilePath取决于父节点(GDataXMLDocument),但这将由 ARC 释放。只要您引用其中的节点和元素,就必须保留某处。GDataXMLDocument这些是GDataXML*类的语义,您必须遵循它们。

于 2013-02-22T15:25:05.010 回答
0

我无法编译,所以这只是一个有根据的猜测,但我怀疑问题是您返回一个指向在方法内部分配和释放的对象的指针:

GDataXMLElement *returnElement = (GDataXMLElement*)infoArray[0];

如您所见,您没有分配 returnElement,因此 ARC 无法理解您需要它。当您退出该方法时,它只是释放 infoArray。如果您复制该值(类似于 [(GDataXMLElement*)infoArray[0] copy] ),它应该可以工作。

于 2013-02-22T15:26:04.307 回答