2010-10-12 86 views
1

我遇到屬性問題。首先,我定義它:@property問題 - 目標C

@property (readwrite) BOOL isPerformingOperation; 

然後合成它:

@synthesize isPerformingOperation; 

然後我將該屬性設置爲這樣:

self.isPerformingOperation = YES;

要確保我做的事情我的日誌:

NSLog(@"class perform is %i",self.isPerformingOperation); 

...它應該返回1。

但是後來我需要從另一個類中讀取屬性 - DAUpdatingView,所以我從我添加屬性的類中導入頭文件並嘗試兩種獲取值的方法,即使當我在原來的班級設置爲1。

NSLog(@"My Boolean: %d, or %@", [USBBackupAppDelegate sharedInstance].isPerformingOperation, [USBBackupAppDelegate sharedInstance].isPerformingOperation ? @"Yes" : @"No"); 

這是控制檯輸出:

2010-10-12 19:32:11.381 USBBackup[3329:a0f] class perform is 1 
2010-10-12 19:32:15.330 USBBackup[3329:a0f] My Boolean: 0, or No 

正如你所看到的,其屬性從已經改變了價值,因爲它本來是主類到,但其他班級不讀它。我錯過了什麼?

編輯:

是的,我用的是原來的類的共享實例:

static USBBackupAppDelegate *sharedInstance = nil; 

+ (USBBackupAppDelegate *)sharedInstance 
{ 
    return sharedInstance ? sharedInstance : [[self alloc] init]; 
} 
+0

類是指類型,該類的每個運行時實例都稱爲對象。你問題的最後一句應該是「屬性設置的主要對象具有改變的值,但另一個對象具有默認值」 - 對象每個都有它們自己的所有屬性副本,因此你可以看到什麼是錯誤的你瞭解類和對象之間的區別。 – 2010-10-12 18:48:28

+0

我有一個類和NSView的子類 - USBBackupDelegate&DAUpdatingView - 我想從DAUpdatingView子類中的USBBackupDelegate類獲取屬性。 – Pripyat 2010-10-12 18:50:46

回答

1
+ (USBBackupAppDelegate *)sharedInstance 
{ 
    return sharedInstance ? sharedInstance : [[self alloc] init]; 
} 

這是行不通的;每次您撥打sharedInstance時,都會創建一個新實例(假設sharedInstance爲零)。

除非,當然,你正在設置sharedInstanceinit,這將是一個非常奇怪的模式。

+0

sharedInstance爲零。 – Pripyat 2010-10-12 18:56:31

+0

我忘記了它的初始化實現,因此它不起作用。現在呢,謝謝! – Pripyat 2010-10-12 18:58:02

+0

正確,並保持這種方式,這意味着消息總是返回一個新的對象,這是不共享的。 – 2010-10-12 18:58:08

1

屬性是每個實例和對象之間不共享。閱讀這個問題的答案看代碼,你想要做什麼

How do I declare class-level properties in Objective-C?

+0

我已經做到了這一點 - 我使用+ sharedInstance來實現這一點。結果仍然是一樣的。 – Pripyat 2010-10-12 18:48:08

+0

sharedInstance與您分配的對象不是同一個對象。 – 2010-10-12 18:52:52

+0

在您的sharedInstance消息中,什麼是sharedInstance變量?它是如何聲明的?它是如何變成非零的?如果您在頭文件中聲明爲實例變量,那麼它不會在實例之間共享。您需要在sharedInstance消息中創建一個本地靜態。 – 2010-10-12 18:55:19

0

好,USBBackupAppDelegate*app = [[USBBackupAppDelegate alloc] init];創建一個新的對象實例。而在新實例中,該屬性尚未設置爲YES。

+0

true,但共享原始實例的sharedInstance仍然返回相同的結果。 :/ – Pripyat 2010-10-12 18:47:06