Question

(Nous parlons de code à l'intérieur de sous-classes UIViewController personnalisées - Et d'ailleurs, je n'utilise pas IB) Ok, je règle donc le membre self.view dans - (void) loadView, puis je crée mes contrôles et views et quoi que ce soit dans - (void) viewDidLoad, puis ajoutez-les à la sous-vue. Si le contrôle n'est pas un membre, si je le crée et le publie localement dans la méthode, voici comment je le fais: (Avec un 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];
}

C’est juste un exemple de la façon dont je créerais une étiquette localement, définirais ses propriétés, l’ajouterais à la sous-vue et la relâcher. Mais avec un membre, je fais ceci:

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];
}

Mais je l'ai aussi vu faire

...
- (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];
}

comme ça dans mes débuts sur le développement de l'iPhone 3: explorer le livre sdk. Remarquez l'ajout de la variable locale, puis la libération. Que devrais-je faire? Est-ce important?

Était-ce utile?

La solution

Si lblMessage est une propriété de rétention (ce qui est souvent vrai), il n'y a pas de différence fonctionnelle. Sinon, release-before-addSubview est un bogue, car il essaiera d’ajouter un objet désalloué en tant que sous-vue.

Voici un aperçu du décompte de références sur localMessage , en supposant que la propriété lblMessage soit conservée:

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.

Vous voulez que retentionCount se termine par 2, puisque vous avez effectivement 2 références à cet objet - votre pointeur de membre lblMessage et un autre pointeur de rétention dans auto .view .

Autres conseils

L’étiquette qui est un membre et l’étiquette de la portée locale sont des références les unes aux autres. Ce sont donc le même objet. Par conséquent, peu importe la façon dont vous le faites, je n’aurais tout simplement pas l’image locale et initialiserais directement l’étiquette

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top