objective-c - ARC 自动发布太早(?)

标签 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为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 说:

it is up to the code that created a document to retain it for as long as any references rely on nodes inside that document tree.

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

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

相关文章:

iphone - 仅使用来自不同目标的类的一部分

objective-c - 使用 XCode 将非 ARC 项目转换为 Objective-C ARC 时,Clang 失败,退出代码为 254

objective-c - EXC_BAD_ACCESS 消息发送到已释放的实例,但我使用的是 ARC?

xcode - 为什么有些属性需要 "strong"而有些则不需要?

ios - Xcode5 自动释放池错误

objective-c - 如何从 WebView 访问页面的 DOM 树?

ios - 延迟一段时间后显示 uipickerview

iphone - 我应该在 iPhone 操作系统中 -drain 或 -release 一个自动释放池吗?

iOS 编程 : 'super dealloc' crashes app

objective-c - 将 UIWebview 限制在某些页面