2012-03-08 11 views
0

私は解決方法がわからないという問題が発生しています。私はいくつかの関連するコードを与えてみましょう。私は私のアプリは、同様の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と関係がありますか?

答えて

1

代理人オブジェクトは、発信者によって(規約により)保持されません。あなたのオブジェクトに設定した呼び出し元がそれを保持することが期待されます。あなたは何が起こっているのかを見るために、ゾンビ(そしてリーク)とインストゥルメントツールを使用することをお勧めします。

+0

これを実行しました。ゾンビでInstrumentsを実行すると、メッセージをデキューしたオブジェクトを送信します。私のFrontpageViewControllerは、ビューがまだ画面上にある間にどのように解放されますか?それを設定した発信者がそれを保持することが期待されていると言いますが、自動的にこれを実行しないので、どうすれば自分で行うのでしょうか?私はそれが強いポインターをここで望ましい解決策にするとは思わない? –

+0

いいえ - 強いポインタにしないでください。あなたは、そのインスタンスを拡大し、すべての保持/解放を見て、何が起こっているかを見ることができるはずです。任意のモーダルまたは他のディスプレイコントローラを表示していますか? didReceiveMemoryWarningを見ることもできます。デフォルトの実装は、画面上になければ自動的にリソースを解放します。 –

+0

この時点で他のView Controllerは使用できません。アプリケーションを開くと、View ControllerはNewsFetcherのインスタンスを作成し、ローカルネットワークからダウンロードしてRSSファイルを解析します。解析が完了するまでに(おそらく秒を要する)、デリゲートオブジェクト(ビューコントローラ)は既に消えています。私はインストゥルメンタルの経験がほとんどないので、どんなヒントも非常に役に立ちます。そのビューコントローラはスクリーンから外れることはありませんので、私はそれがメモリ上で低いとは思わない(さらに、私はシミュレータ上でのみこれをテストしている)。 –

関連する問題