32 votes

L'ivar 'title' existant pour la propriété 'title' de unsafe_unretained doit être __unsafe_unretained.

Je commence à peine à me familiariser avec Objective-C 2.0.

Lorsque j'essaie de construire ce qui suit dans Xcode, cela échoue. L'erreur du compilateur est la suivante :

L'ivar 'title' existant pour la propriété 'title' de unsafe_unretained doit être __unsafe_unretained.

// main.m
#import <Foundation/Foundation.h>
#import "Movie.h"
int main (int argc, const char * argv[]){
    Movie *movie = Movie.new;

    NSLog(@"%@", movie);

    return 0;
}

// movie.h
#import <Foundation/Foundation.h>

@interface Movie : NSObject{
    NSString *title;
    int year;
    int rating;
}

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

@end

#import "Movie.h"

@implementation Movie;

@synthesize title; // this seems to be issue - but I don't understand why?
@synthesize rating;
@synthesize year;

@end

Quelqu'un peut-il m'expliquer où je me suis trompé ?

54voto

Firoze Lafeer Points 13596

Je suppose que vous utilisez l'ARC.

Sous ARC, la qualification de propriété du bien doit correspondre à la variable d'instance (ivar). Ainsi, par exemple, si vous dites que la propriété est "forte", l'ivar doit également être forte.

Dans votre cas, vous dites que la propriété est "assign", ce qui est identique à unsafe_unretained. En d'autres termes, cette propriété ne conserve pas la propriété de la NSString que vous avez définie. Elle copie simplement le pointeur NSString*, et si le NSString disparaît, il disparaît et le pointeur n'est plus valide.

Donc si vous faites ça, l'ivar également doit être marqué __unsafe_unretained pour correspondre (si vous attendez du compilateur qu'il @synthétise la propriété pour vous).

OU vous pouvez simplement omettre la déclaration ivar, et laisser le compilateur le faire pour vous également. Comme ceci :

@interface Movie : NSObject

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

@end

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X