2009-06-13 66 views
1

有一些我試圖理解。我在我的AppsController級的Cocoa應用程序Objective-C:對象聲明問題

NSMutableArray *personArray; 

在此對象的聲明可以放在頭文件中或者類的代碼文件裏面執行這個聲明。沒什麼區別。我甚至可以將它放在#import命令下的@implementation上下文中。應用程序工作正常。

由於我沒有從AppsController類繼承或做任何其他花哨的事情,我想知道這些類型的聲明之間可能有什麼區別?

聲明真的屬於哪裏?

回答

7

這取決於你想如何使用變量。如果你把你的類接口裏面的變量聲明,你的類的每個實例都會有變量,它分開從你的類的所有其他實例其自己副本:

@interface AppsController : NSObject 
{ 
    NSMutableArray *personArray; 
} 

每個實例AppsController類將擁有自己的personArray變量的副本,它與該類的所有其他實例是分開的。

但是,如果你定義變量外設接口的,它成爲一個全局變量,它是一個共享(你的類的實例沒有得到他們自己的副本),並可以從訪問你的班級的任何實例。如果您在頭宣佈它是這樣:

NSMutableArray *personArray; 

它也是在其他文件和類,包括你的頭的方法可見。

如果您在實現文件中聲明變量,但在實現本身之外聲明變量,並且將其作爲static關鍵字的前綴,則該變量僅對類的實現可見。當你想要一個對所有類實例都可見的變量時,這是很常見的,但對其他人不可見,並且是創建類變量的一種方式。

由於您的對象是一個控制器對象,我猜測您的應用程序中只有一個它的實例。你應該聲明變量之一:

  1. 作爲一個實例變量,如果你的personArray變量需要獨特到控制器類(每個實例,即使你只有一個實例現在,你可能有不止一個將來的實例)。
  2. 如果您希望變量對您的類的所有實例都可見,並且只有一個變量的共享實例,那麼將其作爲類變量(使用static關鍵字)。
  3. 如果您希望變量是單個實例(不是您的類的實例唯一),並且對其他類或其他文件中的代碼也可見,則爲全局變量。
4

你應該把它放在頭文件的接口部分,這樣每個對象將會有一個實例被實例化。我認爲這是你的意圖。

我想如果你把它放在別處它將被視爲一個全局變量。也就是說,只會有一個personArray實例,並且它將在應用程序中的任何位置都可見。

您的應用程序可能正常工作,因爲您只有一個AppsController類的實例,並且沒有其他變量稱爲personArray。如果您需要第二個AppsController或另一個名爲personArray的變量,則會遇到問題。

1

如果聲明在執行文件中的變量,但實現本身之外,並用static關鍵字前綴它,變量將只在您的類的實現可見。當你想要一個對所有類實例都可見的變量時,這是很常見的,但對其他人不可見,並且是創建類變量的一種方式。

只是爲了澄清,實現文件內,但實現部分外聲明的原因變量是不可用的類之外​​,是因爲其他類不知道的實現文件裏的任何東西。您的導入語句引用了頭文件,而不是它們的實現,所以他們對這些實現文件聲明一無所知。

無論如何,要創建一個只能由類訪問的靜態變量,在執行文件中進行聲明時使用關鍵字static。你可以把它放在文件的頂部,在實現部分的頂部,或者在一個函數中,這取決於你想要的範圍。

編輯:糾正,不明確聲明爲`static`感謝彼得

+0

全局變量不是靜態的,它們是外部的(C99§6.9.2¶4)。海灣合作委員會有一個編譯器選項,通過使默認情況下符號具有隱藏的可見性,但它通常不會打開並且不是標準的,從而產生這種效果。 – 2009-12-03 08:48:41