2011-12-03 28 views
31

我剛開始認真處理的Objective-C 2.0現有伊娃「標題」爲unsafe_unretained財產「標題」必須__unsafe_unretained

當我嘗試建立在Xcode失敗以下。來自編譯器的錯誤如下:

unsafe_unretained property'title'的現有ivar'標題'必須爲__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 

有人可以解釋我哪裏出了問題嗎?

回答

52

我假設你正在使用ARC。

在ARC下,屬性的所有權限制必須與實例變量(ivar)相匹配。所以,舉個例子,如果你說財產「很強大」,那麼伊娃也必須堅強。

在你的情況下,你說的屬性是「分配」,這與unsafe_unretained相同。換句話說,該屬性不保留您設置的NSString的所有權。它只是複製NSString *指針,並且如果NSString消失,它將消失,指針不再有效。

所以,如果你這樣做,伊娃已被標記__unsafe_unretained匹配(如果你希望編譯器@synthesize你的財產)

或者你可以省略伊娃聲明,讓編譯器也爲你做。像這樣:

@interface Movie : NSObject 

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

@end 

希望有所幫助。

+0

很好的解釋 - 謝謝! – bodacious

+0

高超的解釋。感謝名單! –

+1

是的,你只需要從ARC中的.h文件中刪除伊娃聲明。即,省略「NSString *標題; int年; int評級; }」 –

相關問題