2011-12-26 59 views
0

我只是在我的應用程序,我需要爲NSMutableData的實例變量設置一個值。現在我還爲我的實例變量創建了一個屬性,這意味着我的程序會自動分配它等等,對吧?但後來我給它分配了一個值,但它沒有采取它,但保持空。然後我手動分配它,然後它突然接受了這個值。所以現在我的問題是什麼是屬性的需要,爲什麼我必須手動分配我的實例變量,雖然我有一個屬性設置它?何時使用屬性和分配初始化

在此先感謝!

編輯:我的代碼:

在我的.h文件我在.m文件有

@interface FirstScreen : UIViewController{ 
NSMutableData* fetchedData; 

} 

@property(nonatomic, retain)NSMutableData*fetchedData; 

我:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection{ 
NSString* fetchedDataString= [[NSString alloc]initWithData:fetchedData  encoding:NSUTF8StringEncoding]; 
} 

現在,如果我不落實:

-(void)viewDidLoad{ 
self.fetchedData=[[NSMUtableData alloc]init]; 
} 

fetchedDataString沒有任何價值。但是,如果它被分配了它有一個值。我很困惑什麼時候分配實例變量,什麼時候不分配。

+2

而不是描述你的代碼只是插入它。指出你的問題更容易。 – Cyprian 2011-12-26 19:48:52

回答

1

它不分配。所有屬性都爲您定義實現變量&實現訪問器方法。

我假設「分配一個值」,你的意思是試圖設置你認爲已經分配給你的NSMutableData對象的內容。

0

這是C.你剛纔所說的是真實的每一個變量,無論是本地或實例變量。爲一個變量聲明存儲是一回事(這就是你通過聲明一個屬性所做的)。給它一個價值是另一回事。該聲明在代碼:

NSMutableArray* arr; 

...不會導致arr採取任何特定值(ARC下它是零;電弧之前它可能是任何東西)。它當然不是一個空的可變陣列!但是,這與您在申報財產時所做的完全相同。

如果這是第一個值的變量是採用,這就是所謂的初始化。你可能會在代碼中說:

NSMutableArray* arr = [NSMutableArray array]; 

但你不能做到這一點的財產申報,所以你的代碼運行時,在一段時間後進行初始化。一個典型的方法是做到這一點在你指定的初始化,這樣無論發生什麼事情以後會有這個地址的實際的數組,從很早。

我已經寫了關於這個主題(的iOS編程)一書,以及處理你所遇到的問題的章節是免費在線閱讀:

http://www.apeth.com/iOSBook/ch03.html

+3

所有ivars,包括那些被合成的ivars,在MRR_and_ ARC下被初始化爲適當的'0'值。 MRR中只有自動變量具有未定義的值。 – 2011-12-26 20:10:28

+0

好的加法 - upvoted。 – matt 2011-12-27 20:31:24

1

現在我還創建我的實例變量的屬性,這意味着 我的程序會自動分配它等,對不對?

錯誤。如果您綜合了該屬性的訪問器,如果您還沒有創建一個,那麼也會爲它創建一個ivar。但你的財產只是一個指針......它不指向任何東西,直到你創建一個對象指向並設置它:

self.fetchedData = [[NSMutableData alloc] init]; 
+0

那麼在我的界面中創建一個沒有任何財產的ivar和一個ivar的財產之間有什麼區別? – iJatrat 2011-12-26 23:52:31

+0

@ property屬性指令指出有屬性的訪問器(至少有一個getter和一個setter,如果屬性不是'readonly')。 – Caleb 2011-12-27 02:47:46

+0

那麼假設我設置了ivar =任何和self.ivar =無論哪個都會有什麼區別?我想它有相同的效果不是嗎?感謝您的支持!仍然試圖自我教可可,這對我來說是一個很大的混亂點 – iJatrat 2011-12-27 21:26:59