2012-05-27 114 views
1

僅限iOS 5,使用ARC。在我的核心數據模型類:NSManagedObject類中的實例變量的作用類似於一個類變量?

// Planet.h // 

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@interface Planet : NSManagedObject 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSNumber *diameter_km; 
@property (nonatomic, retain) NSNumber *mass_kg; 

-(void) setVisited:(BOOL)flag; 
-(BOOL) isVisited; 

@end 

// Planet.m // 
  
//#import "Planet.h" 

@implementation Planet 
  
@dynamic name; 
@dynamic diameter_km; 
@dynamic mass_kg; 
  
BOOL visitedByHumans;       // not a core data entity; just an ivar 
  
-(void)setVisited:(BOOL)flag { 
    visitedByHumans = flag; 
} 
-(BOOL)isVisited { 
    return visitedByHumans; 
} 
  
@end 

我使用MagicalRecord來創建「金星」和「火星」。在我的視圖控制器中,我使用標籤和按鈕來測試上述內容。測試表明,當我「訪問」火星時,金星也會被訪問。如果我將伊瓦爾visitedByHumans轉換爲非核心數據屬性,它將按預期工作。所以我不再「卡住」,但我想了解伊娃的事情。

+0

換言之,上述表現爲好像我寫道: 靜態BOOL visitedByHumans; – bedouger

+0

是的,在本質上。 '靜態'只會限制它的範圍,但否則你是正確的。無論哪種方式,這是一個全局變量。 – gschandler

+0

必須在接口中聲明iOS5以前的非屬性實例變量(通常在私有類別中聲明)。對於iOS5,我不能像上面的代碼那樣創建一個實例變量嗎? (術語澄清:由「實例變量」我只是意味着它不是一個屬性,它不是一個靜態的或類變量) – bedouger

回答

2

vistedByHumans實際上並不是真正的ivar,而是您的子類Planet的全局變量。因此,無論實際訪問哪個實例,任何和每個「行星」實例都將被訪問。如果你想成爲一個實際的伊娃,你需要一個@property添加到您的@interface很像namediameter_kmmass_kg(雖然,你的模型生成的三道菜的)。例如:

@property (nonatomic,assign,getter=isVisited) BOOL visited; 

,並在您的實現:

@synthesize visited=visitedByHumans; 

或只是

@synthensize visited; 

既然你似乎是使用這些方法(visitedsetVisited:)無論如何,並沒有真正直接訪問visitedByHumans

另外,一定要刪除的代碼

BOOL visitedByHumans; 

線和兩個方法定義isVisitedsetVisited:。他們將爲你生成,當你@synthesize'他們。

+0

使visitedByHumans屬性成爲解決問題的一種方法。另一種方法是按原始帖子的評論中所述的方式聲明變量。爲了解決這個問題,我會將其標記爲答案。 – bedouger

-1

這是不可能根據您提供的信息是肯定的。您的描述與代碼不匹配 - 儘管您說的是,visitedByHumans絕對不是該代碼中的實例變量。這使我想知道代碼看起來像什麼樣子,然後纔將其從使用Core Data的visitedByHumans中切換出來。基本上,你解釋說,當你使用核心數據時,代碼不能正常工作,但是現在完全不同的代碼實際上並沒有使用核心數據。我不知道你在爲這個屬性使用核心數據時做了什麼,所以我不能告訴你可能做錯了什麼。如果當時的代碼中有visitedByHumans的聲明,那幾乎肯定會讓你失望。同樣,如果你有一個管理對象子setter方法是沒有叫super的實現,你會得到不好的結果。但是,如果你想知道爲什麼你的核心數據的代碼不能正常工作,代碼,而不是一些完全不同的代碼。當你尋求幫助時,不要讓人猜測你要做什麼。

+0

這就是爲什麼我最初指出你對我的github回購,所以你會有所有的代碼。 visitedByHumans從來不是我的代碼中的核心數據屬性。將一個變量放在我的NSManagedObject中並不與CD屬性綁定可能是一個糟糕的設計,但這是我在這種特殊情況下的意圖。底線是,我試圖瞭解如何做不是屬性的實例變量,並且想要確保問題不是因爲它是NSManagedObject的子類(因爲我知道CD在幕後做了很多工作不明白)。 – bedouger

+0

NSManagedObject子類中的實例變量的處理方式與其他類中的相同。但這不是一個實例變量,gschandler在解釋爲什麼以及如何解決它方面做得很好。 –