7
votes

Est une propriété synthétisée déjà alloc / init?

Si j'ai une classe NsObject NSOBJECT PROGRAMMODEL, obtient-elle Alloc / init lorsque je @property et @synthesize d'une autre classe? Par exemple, dans une classe de programme de programcontrôleur, comme celle-ci xxx

, est-ce que j'ai aussi besoin d'alloc / init dans le initwithnibname ou ViewDiDload ou est Il ALLOC / INIT -ÉDEMENT À cause de la propriété / synthétisée ?


0 commentaires

3 Réponses :


9
votes

Vous devez remplir la propriété manuellement. L'exception est si vous avez une propriété iboutlet code> que vous avez connectée dans un fichier NIB; qui sera renseigné automatiquement lorsque la pointe est chargée.

Je trouve que pour afficher les contrôleurs La grande majorité des propriétés sont iboutlets code> et des propriétés décrivant ce que la vue montrera, et ce dernier cas est généralement Défini par l'objet qui crée le contrôleur d'affichage. Ce sera généralement le cas pour un contrôleur d'affichage qui affiche une vue détaillée pour certains objets. p>

Si vous avez des propriétés entièrement locales sur le contrôleur d'affichage, un modèle commun consiste à écrire votre propre getter et Setter (plutôt que d'utiliser @synthesize code>) et de créer l'objet dans le getter s'il n'existe pas. Ce comportement de chargement paresseux signifie que vous pouvez facilement libérer des ressources dans des conditions de mémoire faible et que vous ne payez que le coût de chargement d'un objet lorsque vous en avez besoin. P>

// simple lazy-loading getter
-(MyPropertyClass*)propertyName {
    if(propertyIvarName == nil) {
        propertyIvarName = [[MyPropertyClass alloc] init];
        // ... other setup here
    }
    return propertyIvarName;
}


5 commentaires

techniquement la sortie est nil jusqu'à ce que la nib soit chargée, qui (dans le cas de Nswindow / ViewController) n'arrivera pas tant que vous invoquerez [fenêtre du contrôleur] < / code> ou [Vue du contrôleur] .


Je ne suis pas sûr de la distinction que vous dessinez est ici. J'ai dit "quand la pointe est chargée" ...


@Seamus Oui, je voulais juste clarifier que le chargement de la nib ne se produit pas nécessairement lors de l'initialisation. Je me suis mordu tant de fois en essayant d'accéder aux points de vente qui n'étaient pas là parce que je n'avais pas encore chargé la nibrité.


-1 Il est souvent plus approprié d'attribuer des propriétés dans -Init , car -ViewDidLoad peut être appelé plusieurs fois tout au long du cycle de vie de l'objet, et la vue peut ne pas être chargée immédiatement. Une propriété "modèle" devrait définitivement être liée à la durée de vie du contrôleur et non à la vie de la vue.


Le chargement paresseux ne vaut la peine que pour des choses qui utilisent une quantité importante de mémoire, bien sûr;)



6
votes

Par défaut, toutes les variables d'instance sont égales à zéro. Dans le cas d'objets, cela signifie qu'ils sont nil . Si vous souhaitez une valeur initiale dans la propriété, vous devez le mettre dans votre initialisateur / ViewDidDload Méthode.


0 commentaires

1
votes
  • @Property ne déclare que les méthodes Getter / Setter.
  • @synthesize ne génère que les accesseurs pour vous.

    Ce ne sont pas automatiquement attribués de valeurs, en dehors de la mémoire étant mise à zéro. De plus, vous devez les définir à nil dans -DeAlloc pour éviter une fuite.

    Cela n'a pas non plus de sens pour "Alloc une propriété". Une propriété d'objet est un pointeur. (Et pensez à ce qui se passe si vous avez une classe de liste liée ...)

    (N.B.: Les attributs de propriété affectent également la méthode @synthétisée et les propriétés sont également connues de l'exécution; voir class_copypropertylist () et amis.)


0 commentaires