私は解決方法がわからないという問題が発生しています。私はいくつかの関連するコードを与えてみましょう。私は私のアプリは、同様のiOS 4で動作するようにしたいので、まだ使用している間、私は、unsafe_unretained使用してい代理人のプロパティが設定されていませんか?
@property (nonatomic, unsafe_unretained) id <NewsFetcherDelegate> delegate;
FrontpageViewController(のviewDidLoad)
NewsFetcher *newsFetcher = [[NewsFetcher alloc] initWithURL:url];
newsFetcher.delegate = self;
[newsFetcher loadData];
NewsFetcher.h便宜上ARC。
NewsFetcher.m
- (id)initWithURL:(NSURL *)url {
self = [super init];
if (self) {
self.url = url;
self.receivedData = [[NSData alloc] init];
}
return self;
}
- (void)loadData {
NSLog(@"%@", self.delegate); // FrontpageViewController, as expected
NSURLRequest *request = [NSURLRequest requestWithURL:self.url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:15];
if (self.connectionInProgress)
[self.connectionInProgress cancel];
self.connectionInProgress = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];
}
このすべてが正常に動作します。 NewsFetcherはNSURLConnectionDelegateプロトコルに準拠しているので、呼び出される次のメソッドはconnection:didReceiveData:
です。しかし、私がそのメソッド内でもう一度NSLog(@"%@", self.delegate)
を実行すると、さまざまな結果が得られます(EXEC_BAD_ACCESS、NSCFDictionaryなど)。これは、私のdelegate
プロパティが解放されたオブジェクトを指していることを意味していると思います。なぜなら画面上にあるビューコントローラであるはずですから(つまり、リリースできなかったからです)
私のデリゲートはどのように1つのメソッドで利用できますが、次のメソッドでは使用できません。 unsafe_unretained
と関係がありますか?
これを実行しました。ゾンビでInstrumentsを実行すると、メッセージをデキューしたオブジェクトを送信します。私のFrontpageViewControllerは、ビューがまだ画面上にある間にどのように解放されますか?それを設定した発信者がそれを保持することが期待されていると言いますが、自動的にこれを実行しないので、どうすれば自分で行うのでしょうか?私はそれが強いポインターをここで望ましい解決策にするとは思わない? –
いいえ - 強いポインタにしないでください。あなたは、そのインスタンスを拡大し、すべての保持/解放を見て、何が起こっているかを見ることができるはずです。任意のモーダルまたは他のディスプレイコントローラを表示していますか? didReceiveMemoryWarningを見ることもできます。デフォルトの実装は、画面上になければ自動的にリソースを解放します。 –
この時点で他のView Controllerは使用できません。アプリケーションを開くと、View ControllerはNewsFetcherのインスタンスを作成し、ローカルネットワークからダウンロードしてRSSファイルを解析します。解析が完了するまでに(おそらく秒を要する)、デリゲートオブジェクト(ビューコントローラ)は既に消えています。私はインストゥルメンタルの経験がほとんどないので、どんなヒントも非常に役に立ちます。そのビューコントローラはスクリーンから外れることはありませんので、私はそれがメモリ上で低いとは思わない(さらに、私はシミュレータ上でのみこれをテストしている)。 –