我在 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 过早,并且能够通过将文档绑定(bind)到类 B 中的属性来阻止这种行为:
@property (nonatomic,strong) GDataXMLDocument *infoXMLDoc;

但是我对这个解决方案有点不满意。我永远不会再使用该属性,我只需要该元素解析它一次。如果可以通过属性停止发布,是否还有一种方法可以在方法中执行此操作?我像这样尝试了 __strong 限定符:
GDataXMLDocument __strong *infoXMLDoc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];

但这没有帮助。所以我的问题,假设 ARC 确实负责:

1. 是否可以在方法中告诉 ARC 不释放对象?

2. 我对这里的行为有什么不明白的地方? 我现在使用 ARC 有一段时间了,这是我第一次被卡住。

最佳答案

GDataXMLNode.h header 说:



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

关于objective-c - ARC 自动发布太早 (?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15027214/

10-14 22:22