Объективная ошибка C EXC_BAD_ACCESS помогите пожалуйста - PullRequest
0 голосов
/ 20 августа 2010

В настоящее время я использую прагматический скринкаст на Objective-C, чтобы помочь мне запрограммировать цель-c.Я имею опыт работы с Java и C ++, но мне очень трудно привыкнуть ко всему в Objective (в основном потому, что мне не нравится синтаксис).Ниже приведена ошибка, которую я получаю со всем кодом.Я также получаю предупреждение в классе movie.m: атомарное свойство Wirtable 'title' не может быть совмещено с синтезированным установщиком / получателем с заданным пользователем установщиком / получателем

спасибо за вашу помощь.1004 * Я получаю эту ошибку

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”.

Я запустил ее через отладчик, и адрес фильма в приведенном ниже коде выделен красным

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;}

Movie.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);
}

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Вы используете year=%@, когда оно должно быть year=%d.

Еще несколько случайных мыслей:

Вы должны сохранить или даже лучше скопировать заголовок, а не назначать его.

Метод init должен называться

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

Не забудьте тогда метод dealloc.

0 голосов
/ 20 августа 2010

Ваше свойство title является типом объекта и, как правило, должно быть либо retain, либо copy - в случае свойств NSString традиционно используется copy, чтобы избежать проблем, когда вы вместо NSMutableString.

@property (copy) NSString* title;

Поскольку вы явно определяете установщик, вам нужно реализовать эту политику самостоятельно, что-то вроде этого:

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

Вам также потребуется включить dealloc метод для очистки:

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