2017-05-14 1 views
0

Je crée un initialiseur de concepteur avec des arguments entrants NSString * Dans ma classe, j'ai la propriété NSString * title.Après avoir init EXC_BAD_ACCESS à NSString

@property (nonatomic) NSString *title; 
... 
- (instancetype)initWithTitle:(NSString*)title albumCover:(UIImage *)img { 
    self = [super init]; 
    if (self) { 
     self.title = [[NSString alloc] initWithFormat:@"%@",title]; 
     self.img = img; 
    } 
    return self; 
} 

avec variable self.img tout est bon, mais avec self.title j'ai des problèmes. Si je veux enregistrer self.title, j'obtiens une erreur : L'exécution a été interrompue, raison: EXC_BAD_ACCESS (code = 2, adresse = 0x16fcbbff0). Le processus a été renvoyé à l'état avant l'évaluation de l'expression. J'ai essayé d'initialiser avant d'assigner, essayé avec NSMutableString. Toujours la même chose. Qu'est-ce que je fais mal?

+2

Afficher la trace de l'accident, s'il vous plaît. Il n'y a rien de mal avec ce code, comme écrit (bien que ce soit une bonne idée d'éviter d'utiliser le getter/setter dans l'initialisation et la désallocation d'un objet). Le problème est ailleurs. – bbum

Répondre

1

L'affectation n'est pas votre problème. Le problème est ailleurs. Bien que la déclaration de propriété et l'initialisation ne suivent pas le modèle recommandé, elles n'entraîneront pas de plantage dans le code que vous avez montré.

La procédure suivante fonctionne correctement, par exemple. Vous devez déclarer votre @property en tant que copy et l'assigner directement à la variable d'instance (en évitant ainsi tout problème qui pourrait surgir si vous implémentez ultérieurement un setter personnalisé avec une logique métier nécessitant un objet entièrement initialisé).

@interface Fo:NSObject 
@property (nonatomic) NSString *wrongWay; 
@property (nonatomic, copy) NSString *rightWay; 
@end 

@implementation Fo 
- (instancetype)initWithTitle:(NSString*)title 
{ 
    self = [super init]; 
    if (self) { 
     self.wrongWay = [[NSString alloc] initWithFormat:@"%@",title]; 
     _rightWay = [title copy]; 
    } 
    return self; 
} 
@end 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     Fo *f = [[Fo alloc] initWithTitle:@"Fo"]; 
     NSLog(@"%@ %@ %@", f, f.wrongWay, f.rightWay); 
    } 
    return 0; 
}