iPhone Dev - каким образом следует добавить участника в качестве подпредставления

StackOverflow https://stackoverflow.com/questions/1217556

Вопрос

(Мы говорим о коде внутри пользовательских подклассов 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. Обратите внимание на добавление локальной переменной, затем освобождение. Что мне делать? Это имеет значение вообще?

Это было полезно?

Решение

Если 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 .

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top