ARC过早自动释放(?)

时间:2013-02-22 15:12:58

标签: objective-c automatic-ref-counting autorelease gdataxml

我在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一段时间了,这是我第一次被卡住了。

2 个答案:

答案 0 :(得分:2)

GDataXMLNode.h标题显示:

  

由创建文档的代码决定是否保留它一段时间   因为任何引用都依赖于该文档树中的节点。

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

答案 1 :(得分:0)

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

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

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