1

私はObjective-Cが初めてです。これは、サブビューをプログラムで追加するための単純なコードのARCに関する私の理解です(コメントのように)。間違っている場合は修正してください。特にこの声明について:

「ViewController が myView を弱く指している」というのは、実際には _myView (ViewController の ivar) が UIView オブジェクトを弱く指していることを意味します。

// _myView stores a pointer pointing to a UIView object
// "ViewController points to myView weakly" ACTUALLY means that _myView (ViewController's ivar) points to a UIView object weakly

@interface ViewController ()
@property (nonatomic,weak) UIView *myView;
@end

@implementation
@synthesize myView = _myView;
@end

- (void)viewDidLoad
{
    [superviewDidLoad];
    CGRect viewRect = CGRectMake(10, 10, 100, 100);

    // a UIView object is alloc/inited    
    // mv is a pointer pointing to the UIView object strongly (hence the owner of it)
    UIView *mv = [[UIView alloc] initWithFrame:viewRect];

   // _myView points to the UIView object weakly 
   // Now the UIView object now have two pointers pointing to it
   // mv points to it strongly
   // _myView points to it weakly, hence NOT a owner 
   self.myView = mv;

   // self.view points to the UIView object strongly
   // Now UIView object now have THREE pointer pointing to it
   // Two strong and one weak
   [self.view addSubview:self.myView];
}   

// After viewDidLoad is finished, mv is decallocated. 
// Now UIView object now have two pointer pointing to it. self.view points to it strongly hence the owner, while _myView points to it weakly. 
4

1 に答える 1

3

次の文を除いて、あなたはほとんど正しいです。

viewDidLoad が終了すると、mv はデアロケートされます。

それはあなたが間違っているところです。オブジェクトの割り当て解除は、そのオブジェクトである全員がそのオブジェクトを所有している場合にのみ発生することを覚えておいてretainくださいrelease。したがって、release一時変数 を 'd にしましたmvが、それを保持している別のソースがまだ 1 つありますself.view.subviews。がサブビュー配列から削除されるmvと、適切にクリーンアップされ、_myViewに設定されnil、リークがなくなります。

于 2012-08-30T12:45:57.523 に答える