2011-03-11 1 views
2

La catégorie est une alternative du sous-classement. Que se passera-t-il si le message de catégorie a déjà été implémenté dans la classe. Prenez UIViewController comme exemple,A propos de la catégorie dans Object-C: remplacement existait message

@implementation UIViewController (Landscape) 
// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations. 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 
@end 

Donc, si nous obtenons une XXViewController qui s'étend UIViewController, est que le message par défaut sera mise en œuvre comme ci-dessus? Comme vous pouvez le voir, mon but est de rendre tout le paysage de XXViewController compatible, alors utilisez la catégorie pour atteindre cet objectif.

En fait, la stratégie traditionnelle utilisera la sous-classe, et cela fonctionne. Que diriez-vous de la manière de catégorie?

Merci

Répondre

3

Les catégories peuvent en effet remplacer les méthodes; votre extrait de code est parfaitement légal et devrait faire ce que vous voulez.

Vous devez toutefois faire attention, comme si deux catégories remplaçaient la même méthode, vous obtiendrez des résultats indéfinis. En outre, une catégorie peut être un mauvais choix si vous voulez que certains contrôleurs de vue soient à l'avenir en mode portrait.

Le sous-classement est probablement la meilleure option ici.

1

Vous pouvez utiliser l'approche Cluster de classe ou les méthodes swizzling.

Un sujet avec une question similaire a déjà été traité ici: Category conflicts