Подтвердить что ты не робот

Существующий титул ivar 'для unsafe_unretained property' title 'должен быть __unsafe_unretained

Я просто разбираюсь с Objective-C 2.0

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

Существующий титул ivar 'для unsafe_unretained property' 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

Кто-нибудь может объяснить, где я ошибся?

4b9b3361

Ответ 1

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

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

В вашем случае вы говорите, что свойство "присваивает", что является таким же, как 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

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