クラス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を使用していますが、これが私が立ち往生しているのは初めてです。