0

ARC に問題があります。数時間のデバッグの後、あきらめて、ここで確認することにしました。

基本的に、のMainViewControllerインスタンスを作成する がありますPreviewsView

私はPreviewsViewデリゲートとデータソースのプロパティを持っています:

@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDataSource> dataSource;
@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDelegate> delegate;

PreviewsViewinのインスタンスを作成し、 andとしてMainViewController設定selfし、ビューに追加してインスタンス変数として保存します。delegatedataSource

- (void)addPreviews {
    previewsView = [[PreviewsView alloc] initWithFrame:CGRectMake(0, 75, 1024, 480)];
    previewsView.dataSource = self;
    previewsView.delegate = self;
    [self.view addSubview:previewsView];
}

次に、MainViewControllerナビゲーションコントローラーから削除すると、ACRの割り当てが解除されますが、previewsViewまだ存在し(なぜ???)、トリガーするメソッドを実際に実行しています[self.delegate doSomeStuff]。すでに解放されているようMainViewControllerに、それはスローしEXC_BAD_ACCESSます。

だから基本的に:

  • (previewsView)のインスタンスをMainViewController所有するインスタンスPreviewsView
  • MainViewController割り当てられた asdelegateおよびdataSourceinのインスタンスPreviewsView
  • のインスタンスの割り当てを解除した後MainViewController、previewsView はまだ有効で実行中です。

なぜ何かアイデアはありますか?? ありがとう。

4

2 に答える 2

2

PreviewsView.delegate = nil; のように MainViewController をリリースする前に、デリゲートを nil に設定する必要があります。previewsView.dataSource = nil;

MainViewController の dealloc メソッドでこのコードを呼び出すことをお勧めします - >このようにARCでも使用できます

- (void) dealloc
{
    previewsView.dataSource = nil;
    previewsView.delegate = nil;
    [super dealloc];
}

プロトコルが !assums! previewsView のインスタンスはまだ「生きている」 (通知は同じように機能します) ため、死んでいるか生きているかにかかわらず、インスタンスにメッセージを送信しようとします。そのため、MainViewController が解放されると、previewsView も解放されますが、デリゲートはまだ「生きています」。したがって、それらを nil に設定して委譲を解除する必要があります;)

于 2012-04-26T16:45:26.967 に答える
1

unsafe_unretained は ivar を nil しません。__弱いです。

MainViewController メンバーpreviewsViewはそれを保持しますか? viewDidUnload で、または previewsView を終了した後、nil に設定しますpreviewsView = nil

通常、ivar として保持されるすべての IBOutlets またはサブビューは __weak にする必要があります。サブビューとして追加した後に previewsView が必要ない場合は、ivar を削除できます。

お役に立てれば!

于 2012-04-26T15:02:56.847 に答える