Pourquoi n'est-il pas nécessaire de libérer un point de vente configuré avec & # 8220; assigner & # 8221 ;?

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

Question

Je lis que si j'ai quelque chose comme ça:

@property (nonatomic, assign) UIView *anView;

Dans ce cas, je n'ai plus à me soucier de la gestion de la mémoire. Je n'ai pas à faire [anView release] avec la méthode -dealloc.

Pourquoi?

" assigner " dit simplement au compilateur: "Hey mec, cette propriété ne garde pas ce que quelqu'un lui attribue". Et puis vous pouvez faire

@synchronize anView;

et le compilateur crée comme par magie un getter et un setter, où le setter peut ressembler à ça:

- (UIView*) anView {
    return anView;
}

et le poseur peut ressembler à:

- (void) setAnView:(UIView*)newAnView {
    anView = newAnView;
}

vrai / faux? Si cela était vrai, le créateur du texte ne revendique aucun droit de propriété sur la variable newAnView, car il ne s'agit pas d'une option "conserver". propriété. Il la prend juste et l'assigne à la variable d'instance. Par conséquent, lors de l'examen de la politique de propriété, il n'est pas nécessaire de publier la variable d'instance anView dans -dealloc. L'objet ne le possède pas. Est-ce correct?

Était-ce utile?

La solution

Oui, vous avez fondamentalement raison. Supposons que le ramasse-miettes est désactivé (sinon, cela n'a pas d'importance).

Lorsque vous utilisez les propriétés 'assign', vous n'avez pas besoin de libérer l'objet car vous ne l'avez jamais conservé (responsabilité de quelqu'un d'autre).

Cela crée essentiellement une référence faible: une vue peut être désallouée tant que la propriété pointe toujours dessus. En général, vous utiliseriez 'assign' pour les types de données primitifs, pas pour les objets.

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