Существующий заголовок ivar для unsafe_unretained свойства title должен быть __unsafe_unretained - PullRequest
32 голосов
/ 03 декабря 2011

Я только начинаю справляться с Objective-C 2.0

Когда я пытаюсь построить следующее в XCode, это терпит неудачу.Ошибка компилятора выглядит следующим образом:

Для существующего свойства заголовка ivar для unsafe_unretained свойство title должно быть __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

Может кто-нибудь объяснить, где япошло не так?

1 Ответ

52 голосов
/ 03 декабря 2011

Я полагаю, вы используете ARC.

Согласно ARC, квалификация владельца свойства должна соответствовать переменной экземпляра (ivar). Так, например, если вы говорите, что свойство «сильное», то ивар также должен быть сильным.

В вашем случае вы говорите, что это свойство "assign", которое совпадает с unsafe_unretained. Другими словами, это свойство не сохраняет права собственности на заданную вами строку NSString. Он просто копирует указатель NSString *, а если NSString исчезает, он исчезает и указатель больше не действителен.

Так что, если вы это сделаете, ivar также должен быть помечен как __unsafe_unretained (если вы ожидаете, что компилятор @synthesize свойство для вас)

ИЛИ вы можете просто опустить объявление ivar и просто позволить компилятору сделать это за вас. Как это:

@interface Movie : NSObject

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

@end

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...