0

私はこの問題を抱えています。私は2つのIBOutletsを持っており、プロパティとしてそれらを保持しています。

@interface MCNavigationController : UIViewController 

@property (retain, nonatomic) IBOutlet UIView *contentView;
@property (retain, nonatomic) IBOutlet MCNavBar *navBar;

@end

問題は、deallocで、すべてのリリースを実行した後でも、contentViewとnavBarの割り当てが解除されていないことです。

- (void)dealloc
{
    [contentView release];
    NSLog(@"%@",contentView.superview);
    [navBar release];
    NSLog(@"%@",navBar.superview);
    NSLog(@"%@",self.view);

    [super dealloc];
    NSLog(@"%@",navBar.superview);
    NSLog(@"%@",contentView.superview);
    NSLog(@"%@",self.view);

}

そして、ログでこれは私が得るものです:

2012-08-21 14:48:05.646 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.649 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.650 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.650 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:05.651 ShopRite[4250:12503] <UIView: 0x66b77d0; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x66b7800>>
2012-08-21 14:48:13.726 ShopRite[4250:12503] *** -[MCNavigationController view]: message sent to deallocated instance 0x66b5f20

ただし、「self.viewの場合と同様に、navBarとcontentViewの割り当て解除されたインスタンスにメッセージが送信されます。他の場所に保持したり、他のビューに追加したりしないことは間違いありません。

任意の提案をいただければ幸いです。

4

2 に答える 2

1

すべてのリリースを行った後でも、contentView と navBar はまだ割り当て解除されていません。

これらのビューは、さまざまな方法で保持できます。

  1. これらのビューは、おそらくコントローラーのビューのサブビューです (したがって、コントローラーのビューによって保持されます)。UIViewControllerまた、コントローラーのビューはのでのみ解放されます。これは の最後deallocに発生するため、ログに記録した場所では発生していません。dealloc
  2. ビュー コントローラーを xib と共にロードしているため、ビュー コントローラーは、ロード中に xib とそのすべてのオブジェクトを保持します。繰り返しになりますが、これはUIViewControllerのでリリースされ、 の最後deallocに発生します。dealloc
  3. 誰かがそれを保持してから自動解放した場合、自動解放プールによって引き続き保持される可能性があります。(多くのコードは、オブジェクトを保持してから自動解放します。これは間違いではないためです。) したがって、オブジェクトの割り当てが解除される正確なタイミングは、常に予測できるとは限りません。自分の側でメモリ管理を正しく行うことだけを心配してください。心配する必要はありません。
于 2012-08-21T19:23:08.230 に答える
-1

これをxibで使用していると仮定しています。

xib を使用している場合、これはスーパービューから削除されるか、ウィンドウから削除されるときに解放されます。

IBOutlet を使用する場合、解放を行う必要はありません。

于 2012-08-21T12:09:50.127 に答える