2011-08-31 71 views
5

我在客觀C.基本目標C變量聲明

如何變量聲明

1困惑:我看到使用@property@synthesize聲明。我的問題是,這兩個聲明有什麼關係?爲什麼他們總是一起使用?我猜@synthesize是創建getter和setter的捷徑嗎?

2:說,我想聲明一個NSMutableArray,只能在聲明的類內部訪問。在使用addObject方法向它寫入內容之前,必須執行myArray = [[NSMutableArray alloc] init]。那麼我什麼時候釋放數組?

3:是否有不同的方式來聲明一個變量,只有在它被宣佈在所有類是可訪問的類時,纔可訪問?

4:與問題2類似,但現在變量是NSString。爲什麼我不需要分配& init來在它自己的類中共享相同的變量?請告訴我感謝不同myString = @"";

之間 self.myString = @"";

很多。

+0

當你進入objective-c時,你可能想看看斯坦福大學的課程(iTunes)。它幫助我學習了曲線。 – nykash

+0

這是一個非常廣泛的問題,涵蓋在SO上很好的地面。請看看周圍。這裏有四個以前的帖子解決你的問題。 1:[@property和@synthesize是什麼區別?](http:// stackoverflow。2)[何時發佈實例變量](http://stackoverflow.com/questions/4063905/)3:[如何聲明實例變量在實例外不可見?](http:/ /問題/ 806379 /) /stackoverflow.com/questions/5826345/)4:[self.var與var之間的區別](http://stackoverflow.com/questions/4627646/)每個主題都有其他人。 –

回答

1

1)@property聲明一個公衆可訪問的變量和相關聯的獲取和設置。 @synthesize會導致編譯器自動生成getter和setter的定義(代碼)。

2)你會在你的類聲明中的頭文件中聲明NSMutableArray。您將在您的init方法中初始化該變量,然後您將在dealloc方法中釋放該變量。

3)使用@property創建的變量是公開的。可以使用@private關鍵字將類聲明中定義的變量(在頭文件中使用@interface)聲明爲該類的私有變量。

約翰,這些問題都很基礎。您可能會從這裏的Objective-C編程介紹中獲得很多(http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html#//apple_ref/doc/uid/TP30001163)。

+0

'@ property'不聲明可公開訪問的_variable_。 ivar本身(如果合成)是'@ protected'。它聲明的是該類某些方面的接入點。實際上甚至不需要支持它的變量,只要你履行了getter和setter方法的合約(或只是getter,在'readonly'的情況下)。 –

+0

謝謝澄清Josh。 –

+1

FWIW,如果你寫自己的getter和/或setter,一個屬性甚至不必有一個ivar。它也可以計算一些東西,或者從一個項目轉換到另一個項目。例如。一個Angle類也可以擁有屬性弧度的屬性度數。只有屬性弧度有後盾,但屬性度數(通過setter和getter,分別爲'degrees'和'setDegrees:')根據方向轉換爲弧度和弧度。 File類可以具有fullName屬性,該屬性使用服務器,目錄和文件名來生成或解析完全限定的名稱。 –

5

關於第一個問題:

@property (nonatomic, retain) NSString * someProperty; 

此聲明類的屬性。它成爲類的公共合同的一部分,但仍然缺乏一些重要的東西 - 實際執行

@synthesize someProperty; 

這是編譯器的糖,其創建自己財產的getter和setter方法。換句話說,這是爲了在您的課堂和其他課程中實際使用您的財產而需要的實施。

您幾乎在所有情況下都會爲您申報的每個@property設置一個@synthesize


關於第二個問題:

您是如何初始化數組屬性正確。爲了釋放它,你會做你的類dealloc方法如下:

- (void) dealloc { 
    self.myarray = nil; 

    [super dealloc]; 
} 

這有效地釋放了陣列(假設你用關鍵字宣佈你的財產保留)。


併爲你的最後一個問題:一類

屬性始終可以從其他類。爲了創建一個全球可訪問的變量變量你會聲明它爲static

+0

您可能沒有針對每個屬性的「@綜合」。它也可以是'@ dynamic',或者你可以簡單地聲明一個ivar並實現正確命名的方法。 –

+0

我同意你的第一點,但你的第二點與@property無關,並且與KVC更相關。編輯我的回答來反思。 – Perception

+1

@Josh:的確如此。在其他評論之一中,我舉了幾個例子,你寫了我們自己的訪問器,甚至沒有ivar,因爲訪問者可以依賴其他方式(直接文件訪問,端口,數據庫,算法等) )比直接獲得或設置伊娃。在這種情況下,你不合成。 –

2

廣告1:一個屬性是一個構造來控制獲取者和設置者訪問ivar(通常是私有的)。事實上,一個財產甚至不需要支持伊娃。是的,@synthesize會產生getter和setter(和ivar)。

廣告2:當你不再需要它時,你可以釋放它。當這取決於你的代碼的邏輯。

廣告3:如果我理解正確,則需要@私人ivars。通常情況下,ivars是受保護的,即只能在類或派生類中訪問。私人ivars只能在課堂內部進行訪問。屬性可公開訪問。

廣告4:myString = @「」直接寫入伊娃,而self.myString = @「」使用屬性設置器。

+0

我偶然發現一個場合,我無法在課堂上讀回伊娃。然後,我正在使用'ivar = something'。把它改成'self.ivar = something'解決了這個問題。你能分享一些見解嗎?我猜這個伊娃在我讀回NULL時得到了自動發佈。如果有幫助,伊娃是CLLocation。我不需要爲'NSString' ivars執行'self'。 – John

+0

屬性,如果聲明爲(複製)或(保留),將保留該項目(並釋放前一項),而直接訪問伊娃則不會這樣做。屬性可幫助您執行內存管理,因爲編譯器將生成正確保留和釋放項目的代碼。當然,它們仍然必須在dealloc中釋放。所以儘量在任何地方使用屬性,除了在init和dealloc中。 –

0

你需要在Objective-C上找到一個文本或者找到一個在線教程 - 這是一種足夠神祕的語言,你不能希望用點滴和單調來拾取它。

有變量,有屬性 - 兩個不同的東西相交。

可以聲明普通老式實例變量如C/C++相同的方式,更多或更少:

NSArray* myArray; 

例如,放置在@interface的{}密閉部分。

但是,您也可以擁有一個物業,您通過在@interface聲明(在關閉}之後)說@property聲明。屬性具有getter方法 - 默認情況下稱爲myProperty - 和推杆方法 - 默認情況下稱爲setMyProperty。如果myProperty與其中一個實例變量名稱相同,則可以使用@synthesize自動創建這些方法。

請注意,屬性可能自動retain當使用默認設置方法。這在管理存儲方面相當方便。

但是管理存儲是一個很大的話題,你必須閱讀一些很好的教程 - 我們無法用幾段來解釋它。