2012-08-11 31 views
0

我一直在檢討,從科昌的優秀Objc-C本書的一些基本目標C筆記,我注意到這是從一個類創建的指針代碼,而不是手動分配,例如:指針類,但尚未分配?

//... 

int main (int argc, char *argv[]) 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSNumber *myNumber, *floatNumber, *intNumber; 
NSInteger *myInt; 

//integer value 

intNumber = [NSNumber numberWithInteger: 100]; 
myInt = [intNumber integerValue]; 
NSLog (@"%li", (long) myInt); 

//... 

注意所有沒有'[[class allocate] init]'創建的實例,所以如何在不爲其分配內存的情況下創建指針?

回答

1

諸如[NSNumber numberWithInteger: 100]之類的方法確實爲NSNumber對象分配內存。按照慣例這種類方法相當於[[[NSNumber alloc] initWithInteger: 100] autorelease]。與正常的alloc/init成語的區別在於它已經返回了一個你不擁有的對象。它會在下一次通過運行循環時自動釋放。請注意,如果您未使用自動引用計數(ARC),則此差異僅存在。在手動引用計數環境中,以這種方式創建臨時對象通常非常方便,只需在您創建它們的例程中使用,而不必稍後記住release。您可以在Apple的Memory Management Programming Guide中閱讀更多有關Objective C內存管理的內容。

0

聲明NSInteger *myInt;NSInteger myInt;

+0

as'[intNumber integerValue];'不返回指針。 – samfisher 2012-08-11 06:47:56

1

不知道在那裏你的困惑就在於我會用簡單的開始,通常被稱爲變量,道歉,如果這是太基本。

當你寫:

NSInteger someNumber; 

你分配一個適合用於存儲NSINteger,並要求這盒由名稱someNumber被稱爲 - 盒子還有另外一個名字,通常被稱爲其地址指針。所以你已經爲整數分配了空間。

同樣,當你寫:

NSNumber *intNumber; 

你分配一個適合用於存儲NSNumber * - 這是指定要這個盒子包含的其他框的名稱(地址)的方式 - 並要求將此框稱爲intNumber。所以,你的指針分配空間,你還沒有分配的是一個箱,存放一個NSNumber(注意沒有*),其(或地址指針),你可以在intNumber存儲。

現在行:

releasePool *pool = [[NSAutoreleasePool alloc] init]; 

做兩件事情。左側正是前兩個例子所做的,它分配一個盒子,給它一個方便的名稱pool,這個盒子適用於保存值爲NSAutoreleasePool的盒子的名稱。

現在右手大小是一個表達式,它使用alloc分配一個適用於保存NSAutoreleasePool值的框;使用init將值放入該框中;然後返回框的名稱的

最後,分配採用由RHS返回的名稱,並將其放入由LHS創建的框中。

因此整體上聲明創建了兩個框。

這使我們向您:

intNumber = [NSNumber numberWithInteger: 100]; 

這裏LHS規定,已經創造了一個盒子。 RHS是一個表達式,它返回一個盒子的名字。 RHS方面的名稱創建在哪裏?我們只能真的猜到(除非我們有numberWithInteger的來源),那並不重要 - 該框由某人在某個時間創建,表達式返回其名稱。該作業將我們未分配的框名稱放入我們所做的intNumber框中。這就是你需要知道的全部......

差不多。如果您正在使用ARC或GC,則可以在此停止。如果您使用的是MRC,您需要知道該框是否爲retain,但這是另一個問題...

HTH。