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

クラスBのreturnElementメソッドの最後にあるは完全に初期化されており、testStringB文字列には正しい値が含まれています。しかし、クラスAでは、の内容InfoElementはなくなり、testStringAはnilになります。

ARCがGDataXMLDocumentをリリースするのが早すぎたのではないかと思います。ドキュメントをクラスBのプロパティに関連付けることで、この動作を停止できました。

@property (nonatomic,strong) GDataXMLDocument *infoXMLDoc;

しかし、私はこの解決策に少し不満を持っています。そのプロパティを二度と使用することはありません。要素が必要なのは1回だけです。プロパティを使用してリリースを停止できる場合、メソッド内でこれを行う方法もありますか?私は次のような__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 に答える