2011-12-03 7 views
31

を__unsafe_unretainedする必要があります。コンパイラのエラーは次のようになります。既存のIVAR「タイトル」「タイトルは」私はそれが失敗したXcodeで、次を構築しようとした際、私はちょうどのObjective-C 2.0</p> <p>でグリップを取得しています

unsafe_unretainedプロパティ 'title'の既存のivar '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 

どこで間違っていたのですか?

答えて

52

あなたはARCを使用していると仮定します。

ARCの場合、プロパティの所有権はインスタンス変数(ivar)と一致する必要があります。たとえば、プロパティが「強い」と言う場合、ivarも強くなければなりません。

あなたの場合、プロパティはunsafe_unretainedと同じ「割り当て済み」と言っています。つまり、このプロパティは、設定したNSStringの所有権を保持しません。 NSString *ポインタをコピーするだけで、NSStringがなくなると消え去りポインタが無効になります。

あなたが行うのであればIVAR 一致する__unsafe_unretainedマークする必要があります(あなたはあなたのためのプロパティを@synthesizeするようにコンパイラを期待している場合)

ORあなただけのIVAR宣言を省略することができることをコンパイラにもあなたのためにそれをさせてください。このように:

@interface Movie : NSObject 

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

@end 

+0

すばらしい説明 - ありがとう! – bodacious

+0

優れた説明。ありがとう! –

+1

はい、ARCの.hファイルからivar宣言を削除するだけです。つまり、「{ NSString * title; int year; int rating; }」を省略します。 –

関連する問題

 関連する問題