2009-06-18 4 views
0

Je suis intrigué par la ligne "static NSString * MyIdentifier = @" MyIdentifier ";" dans la méthode: cellForRowAtIndexPathQue signifie "MyIdentifier" dans la programmation Objective-c ou iPhone

Que fait cette ligne? Crée-t-il simplement un pointeur aléatoire sur un objet NSString et lui affecte-t-il la chaîne? Pourquoi est-ce qu'on l'appelle MyIdentifier, je l'ai vu dans de nombreux exemples.

#import "AddToFavorites.h" 


@implementation AddToFavorites 

- (id)initWithStyle:(UITableViewStyle)style { 
    if (self = [super initWithStyle:style]) { 
    } 
    return self; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 
    return 5; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *MyIdentifier = @"MyIdentifier"; 

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:MyIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
reuseIdentifier:MyIdentifier] autorelease]; 
} 
// Configure the cell 

return cell; 
} 

@end 

Voici un autre exemple, celui-ci a une chaîne différente, CellIdentifier.

- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"TimeZoneCell"; 

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [self tableviewCellWithReuseIdentifier:CellIdentifier]; 
} 

[self configureCell:cell forIndexPath:indexPath]; 
return cell; 
} 

Répondre

6

UITableViews peut automatiquement réutiliser des cellules pour économiser de la mémoire. Pour en profiter, vous devez spécifier un "identifiant de réutilisation" qui est utilisé par UITableView pour pouvoir rechercher des cellules existantes ("dequeueReusbaleCellWithIdentifier") avec le même identifiant que celui que vous allez créer s'il ne trouve pas de cellule existante.

La ligne crée une variable statique (globale en ce sens qu'elle est partagée par tous les chemins de code et initialisée une seule fois, mais locale dans laquelle vous ne pouvez y accéder que dans cette méthode) pour contenir la NSString pour l'identificateur. Je suppose qu'il s'agit de s'assurer que le même pointeur est utilisé à chaque fois, car la comparaison des pointeurs est rapide et facile, tandis que la comparaison du contenu des chaînes peut prendre un peu plus de temps.

1

Pour les performances mentionnées, mais aussi pour obtenir de l'aide du compilateur pour détecter les fautes d'orthographe. Il n'y a pas de vérification de votre identifiant si vous utilisez un @ "" - chaîne littérale. Le compilateur vous fera une erreur si vous avez mal orthographié l'identifiant statique. Codesense complètera également l'identificateur statique.

0

L'identificateur est une clé ou une étiquette qui vous permet d'avoir plusieurs collections de cellules distinctes à des fins différentes. Cela vous permet d'économiser du temps et de la mémoire vive. Découvrez comment. Supposons que vous ayez une application de liste de contacts, avec deux types de contacts, des entreprises et des amis. Si vous souhaitez les afficher différemment, vous pouvez concevoir deux types de cellules: une avec une photo (photo d'ami) et un nom en police noire, et une autre avec le nom de l'entreprise et aucune image ou icône. Lorsque l'utilisateur utilise l'application, il peut être nécessaire d'afficher 3 amis et 4 entreprises dont le nom commence par "A-M", il a donc besoin de 3 cellules amis et de 4 cellules d'entreprise. Vous les passez, et étiquetez toutes les cellules d'amis avec l'identifiant "friend", et toutes les business avec l'identifiant "business".

Plus tard, lorsque la vue changera et voudra juste des noms commençant par "P-T", vous pourriez avoir 7 entreprises. Idéalement, vous réutiliserez les cellules que vous avez déjà créées, il demande donc 7 cellules avec l'identifiant "business", et il s'avère que vous avez déjà tagué 4 cellules que vous avez déjà créées avec "business", donc il les réutilise simplement. Les 3 autres que vous avez déjà créées ont la mauvaise balise, donc elle les ignore (ou peut-être les supprime?) Et crée 3 nouvelles cellules de type métier et leur attribue la balise "business". En réutilisant les cellules de cette manière, vous économisez de la mémoire (vous n'avez besoin que d'un seul nombre de cellules pouvant être affichées simultanément) et de la performance (inutile d'allouer et d'initialiser de nouvelles cellules pendant le défilement). haut et bas). Vous échangez cela contre l'effort supplémentaire du programmeur d'écrire ce code de sélection et de donner des identifiants.Ils pourraient avoir automatiquement étiqueté les cellules en fonction du type Objective-C, mais cela ne fonctionnerait pas si vous créiez par programme le contenu d'une cellule plutôt que de sous-classer ou d'utiliser le constructeur Interface pour disposer vos cellules. Donc, ils fournissent le mécanisme d'identifiant à la place.

Si vous n'avez qu'un seul type de cellule dans votre table, appelez simplement "Alice" et oubliez-le.