Почему этот код из поваренной книги iPhone Developer работает? - PullRequest
1 голос
/ 09 августа 2009

Я пробовал часть кода представления из книги Эрики Садун "Поваренная книга разработчика iPhone" и нашел код, который я не понимаю. Вот код для метода loadView:

- (void)loadView
{
    // Create the main view
    UIView *contentView = [[UIView alloc] initWithFrame: 
        [[UIScreen mainScreen] applicationFrame]];
    contentView.backgroundColor = [UIColor whiteColor];
    self.view = contentView;
   [contentView release];

    // Get the view bounds as our starting point
    CGRect apprect = [contentView bounds];

    // Add each inset subview
    UIView *subview = [[UIView alloc] 
        initWithFrame:CGRectInset(apprect, 32.0f, 32.0f)];
    subview.backgroundColor = [UIColor lightGrayColor];
    [contentView addSubview:subview];
    [subview release];
}

Мой вопрос: почему она выпускает contentView, но затем снова использует его в [contentView addSubview:subview]? self.view = contentView сохранил contentView?

Ответы [ 2 ]

7 голосов
/ 09 августа 2009

Если вы посмотрите в документации по UIViewController, вы увидите, что свойство view объявлено как:

@property(nonatomic, retain) UIView *view;

Это означает, что когда вы используете setView: метод (или используете .view слева от =), то любое значение, которое вы передаете, будет сохранено. Итак, если вы пройдете по коду и посмотрите, сколько осталось, вы получите следующее:

- (void)loadView {
    // Create the main view
    UIView *contentView = [[UIView alloc] initWithFrame: 
            [[UIScreen mainScreen] applicationFrame]];  //retain count +1
    contentView.backgroundColor = [UIColor whiteColor];  //retain count +1
    self.view = contentView;  //retain count +2
    [contentView release];  //retain count +1

    // Get the view bounds as our starting point
    CGRect apprect = [contentView bounds];

    // Add each inset subview
    UIView *subview = [[UIView alloc] 
            initWithFrame:CGRectInset(apprect, 32.0f, 32.0f)];
    subview.backgroundColor = [UIColor lightGrayColor];
    [contentView addSubview:subview];
    [subview release];

}

Я бы сказал, что действительно интересно то, что после выпуска contentView мы все еще можем отправлять ему сообщения, потому что объект, живущий в конце указателя contentView, все еще существует (поскольку он был сохранен путем вызова setView:).

0 голосов
/ 09 августа 2009

Если вы объявите свое свойство следующим образом @property (неатомный, сохранить) ... Если да, свойство сохраняется при назначении. это, вероятно, то, что происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...