2011-04-18 55 views
26

我正在從sqlite數據庫中填充數據的應用程序。所有數據庫相關的東西都在appdelegate類中完成。我用NSMutable數組來保存對象。 我已經使用了一個單獨的NSObject類屬性。我收到錯誤:property 'x' with 'retain' attribute must be of object typeNSInteger,NSNumber「property'x'with'retain'attribute must be of object type」

appdelegate.m文件的代碼如下:

NSString *amovieName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
NSInteger amovieId = sqlite3_column_int(compiledStatement, 1); 
//problem is here the 
//value of movieId is coming from database. 
//But error: "must be of object type" is puzzling me. 
//I am assuming to use NSNumber here. 

我的NSObject文件的代碼如下:

中的.h文件 -

NSInteger movieId; 

其屬性爲:

@property (nonatomic, retain) NSInteger movieId; 

和.M文件 -

@synthesize movieId; 

然後我剛纔初始化爲:

-(id)initWithmovieName:(NSString *)mN movieId:(NSInteger)mId 
{  
    self.movieName=mN; 
    self.movieId=mId; 
    return self; 
} 

我發現了另一種方式: 在NSInteger.for前一個NSNumber的對象。然後類型種姓分配值;

NSNumber aNSNumbermovieID = sqlite3_column_int(compiledStatement, 1); 
      NSInteger amovieId = [aNSNumbermovieID integerValue]; 

但還是我收到同樣的錯誤(財產與「保留」屬性「X」必須是對象類型)。

有什麼建議嗎?

回答

92

NSInteger是一個標量,而不是一個對象。所以你不應該保留它,它應該被分配。更改您的財產將清除警告消息。你並不需要做的,你在加的NSNumber東西。

@property (nonatomic, assign) NSInteger movieId; 

這是一個有點混亂,因爲NSInteger的聽起來像一個類,但它只是爲INT一個typedef。 Apple將它作爲64位支持的一部分進行介紹,以便他們可以將其定義爲代碼編譯所用的處理器的適當大小的整數。

+1

非常感謝你 – Alok 2011-04-18 07:29:12

7

我認爲這個錯誤是因爲@propertyretain對於NSIntegerAssign適用於原始值,如BOOL,NSIntegerdouble。對於使用retaincopy的對象,取決於您是要保留對原始對象的引用還是對其進行復制。

這裏NSInteger顯然不是一個對象,所以你應該嘗試assign,而不是保留

+0

感謝的伎倆! – Alok 2011-04-18 07:30:02

8

只需使用NSNumber,你可以這樣做:

@property (nonatomic, retain) NSNumber *movieId; 
相關問題