2010-08-20 9 views
0

J'utilise actuellement le screencast pragmatique sur Objective-C pour m'aider à programmer en objectif-c. J'ai un background en Java et C++, mais j'ai du mal à m'habituer à tout dans Objective (surtout parce que je ne suis pas à l'aise avec la syntaxe). Voici l'erreur que je reçois avec tout le code. Je reçois aussi un avertissement en classe movie.m ainsi: Wirtable propriété atomique « title » ne peut être coupler un setter synthétisé/getter avec un setter défini par l'utilisateur/getterObjective-C error Aide EXC_BAD_ACCESS

Merci pour votre aide.

Je suis recevoir cette erreur

Current language: auto; currently objective-c 
warning: Couldn't find class validation function, calling methods on uninitialized objects may deadlock your program. 
Program received signal: “EXC_BAD_ACCESS”. 

Je l'ai couru à travers le débogueur et l'adresse du film dans le code ci-dessous est en rouge

main.m

int main (int argc, const char * argv[]) { 

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

Movie *movie = [[Movie alloc] initWithTitle:@"iron man" 
           andRating:5 
            andYear:2008]; 

[movie play]; 
NSLog(@"our movie is %@", movie); 

[pool drain]; 
return 0;} 

Film. h

interface Movie : NSObject { 
    NSString *title; 
    int rating; 
    int year; 
} 
- (id)initWithTitle:(NSString *)newTitle 
      andRating:(int)newRating 
      andYear:(int) year; 

@property(assign) NSString *title; 
@property(assign) int rating; 
@property(assign) int year; 
-(void) play; 

@end 

Movie.m

#import "Movie.h" 


@implementation Movie 

@synthesize title; 
@synthesize rating; 
@synthesize year; 
-(id)initWithTitle:(NSString *)newTitle 
        andRating:(int)newRating 
      andYear:(int)newYear; 
{ 

    self = [super init]; 
    if(nil != self){ 
     self.title = newTitle; 
     self.rating = newRating; 
     self.year = newYear; 
    } 
    return self; 

} 
-(NSString *) description{ 
    NSString *oldDescription = [super description]; 

    return [NSString stringWithFormat: @"%@ title =%@, rating =%d year=%@", 
      oldDescription, self.title, self.rating, self.year]; 
} 
- (void)setTitle:(NSString *)newTitle { 
    title = [newTitle capitalizedString]; 
} 
-(void) play { 
    NSLog(@"Playing %@", self); 
} 

Répondre

1

Vous utilisez year=%@ quand il devrait être year=%d.

pensées Un peu plus au hasard:

Vous devez conserver ou mieux copier même le titre au lieu de lui attribuer.

La méthode init doit être nommé

-(id)initWithTitle:(NSString *)aTitle 
        rating:(int)aRating 
        year:(int)aYear; 

Ne pas oublier une méthode dealloc alors.

+0

Merci pour votre aide. Cela fonctionne maintenant, je ne suis pas allé au point de dealloc, mais merci. Je continue à faire cette erreur. – seanb511

0

Votre title propriété est un type d'objet et doit donc en général être soit retain ou copy - dans le cas de NSString propriétés, il est traditionnel d'utiliser copy pour éviter les problèmes lorsque vous promulgue une NSMutableString à la place.

@property (copy) NSString* title; 

Puisque vous définissez explicitement le poseur, vous devez alors mettre en œuvre vous-même, quelque chose comme la politique suivante:

- (void)setTitle:(NSString *)newTitle 
{ 
    [title release]; 
    title = [[newTitle capitalizedString] copy]; 
} 

Vous aurez également besoin d'inclure une méthode dealloc pour nettoyer:

- (void) dealloc 
{ 
    [title release]; 
    [super dealloc]; 
} 
+0

Merci, je vais regarder, je crois que cela va changer; Je suis seulement passé par la première partie, la deuxième partie de la gestion de la mémoire d'adresse. – seanb511

+0

@ seanb11 Vous devez cliquer sur la petite flèche située à côté de la réponse d'Eiko pour l'identifier comme correcte. Et profiter de la prochaine partie - espérons que ce qui précède aura plus de sens que vous continuez :) – walkytalky

+0

Merci, vient de le faire. – seanb511