iPhone Dev - каким образом следует добавить участника в качестве подпредставления - PullRequest
0 голосов
/ 02 августа 2009

(Мы говорим о коде внутри пользовательских подклассов UIViewController - и, кстати, я не использую IB) Хорошо, поэтому я установил член self.view в - (void) loadView, а затем создал свои элементы управления Представления и все, что в - (void) viewDidLoad, а затем добавить их в подпредставление. Если элемент управления не является членом, если я создаю его и освобождаю его локально в методе, я делаю это следующим образом: (с UILabel)

- (void)viewDidLoad {
    UILabel *localLabel = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
    localLabel.text = @"I'm a Label!";
    localLabel.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                  UIViewAutoresizingFlexibleRightMargin |
                                  UIViewAutoresizingFlexibleBottomMargin);

    [self.view addSubview:localLabel];
    [localLabel release];
    [super viewDidLoad];
}

Это всего лишь пример того, как я мог бы создать метку локально, установить ее свойства, добавить в подпредставление и выпустить. Но с членом я делаю это:

UILabel *lblMessage;
...
@property (nonatomic, retain)UILabel *lblMessage;
...
- (void)viewDidLoad {
    UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
    localMessage.text = @"I'm a Label!";
    localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    self.lblMessage = localMessage;
    [localMessage release];

    [self.view addSubview:lblMessage];
    [super viewDidLoad];
}

Но я также видел, что это сделано

...
- (void)viewDidLoad {
   UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)];
    localMessage.text = @"I'm a Label!";
    localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    self.lblMessage = localMessage;

    [self.view addSubview:localMessage];
    [localMessage release];
    [super viewDidLoad];
}

как в моем начале разработки iPhone 3: изучение книги sdk. Обратите внимание на добавление локальной переменной, затем освобождение. Что мне делать? Это имеет значение вообще?

Ответы [ 2 ]

1 голос
/ 02 августа 2009

Если lblMessage является сохраняющим свойством (что часто имеет место), то функциональной разницы нет. Иначе, release-before-addSubview является ошибкой, так как он попытается добавить освобожденный объект как подпредставление.

Вот краткий обзор количества ссылок на localMessage, при условии, что свойство lblMessage сохраняет:

UILabel *localMessage = [[UILabel alloc]...  // retainCount is now 1
// Set up localMessage.  If you release'd now, you'd dealloc the object.
self.lblMessage = localMessage;  // retainCount is now 2
// You can safely call release now if you'd like.
[self.view addSubview:localMessage];  // retainCount is now 3.
[localMessage release];  // retainCount is now 2.

Вы хотите, чтобы retainCount заканчивался на 2, поскольку у вас фактически есть две ссылки на этот объект - указатель члена lblMessage и еще один сохраняющий указатель в self.view.

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

Метка, которая является членом, и метка локальной области видимости являются ссылками друг на друга, поэтому они представляют собой один и тот же объект, поэтому не имеет значения, каким образом вы это сделаете, я бы просто не использовал local и инициализировал метку напрямую

...