2011-07-02 125 views
0

,我可以做以下對象在目標C未初始化

UIImage *myImage = [UIImage imageNamed:@"myPhoto.jpg"]; 
variable.image = myImage; 

,這工作得很好。但名爲「myImage」的對象從未初始化,並且UIImage從未分配過任何內存,但代碼仍然有效。

有人可以解釋這裏發生了什麼嗎?

回答

2

是的,對象被初始化。 imageNamed:方法分配並初始化一個對象,發送一個autorelease消息,然後將內存地址返回給您。您將該內存地址存儲在名爲myImage的指針中。

myImage和對象是兩個不同的東西。 myImage只是指向一個內存位置。這不是對象本身。

您可以傳遞對象而不將它們分配給變量,並且可以將一個對象分配給多個變量。

考慮一下:

UIImage *imageOne; 
UIImage *imageTwo; 

imageOne = [UIImage imageNamed:@"myPhoto.jpg"]; 
imageTwo = imageOne; 

的形象,不是複製。只有一個對象存在。兩個變量都指向它。

現在考慮這個:

NSLog(@"%@", [UIImage imageNamed:@"myPhoto.jpg"]); 

你沒把它分配給任何變量。但是對象仍然存在,對吧?

+0

這就是開眼界。謝謝。 所以最後一個問題......對象究竟是什麼,我一直認爲指針是對象。例如.. NSString * myString = [[NSString alloc] initWithString:@「Hello」]; 我認爲* myString將是對象。 – Sean

+0

指針是一個指針。指針指向對象。兩個指針可以指向同一個對象。得到它了? – Yuji

+0

Ohhhhh ..哈哈,謝謝。我愛你們。我現在明白了。這使得現在更容易一些。 – Sean

0

看看documentationUIImage。在「高速緩存的圖像加載例程」和「創建新圖像」的標題下,有一些方法,其中+可能需要-。這意味着調用這些方法與調用[[[UIImage alloc] init] autorelease];相同,儘管其中一些方法可以執行更多操作(如自定義初始化中那樣)。

許多其他Objective C對象具有相似的方法,例如,NSArray有一個方法+(id)array,該方法創建並返回一個空數組。您的主要指標是+而不是-,但我經常檢查文檔以檢查初始化是如何處理的,並確保對象是自動釋放的。

+0

這些被稱爲「便利方法」。可可有[非常一致的約定](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership。html)知道Cocoa方法返回的對象的內存管理規則,所以一旦你知道規則,檢查每種方法的文檔是不必要的。 '+'vs'-'表示一個方法是類方法還是實例方法,它與這個問題沒有直接關係。 – Jim