,我可以做以下對象在目標C未初始化
UIImage *myImage = [UIImage imageNamed:@"myPhoto.jpg"];
variable.image = myImage;
,這工作得很好。但名爲「myImage」的對象從未初始化,並且UIImage從未分配過任何內存,但代碼仍然有效。
有人可以解釋這裏發生了什麼嗎?
,我可以做以下對象在目標C未初始化
UIImage *myImage = [UIImage imageNamed:@"myPhoto.jpg"];
variable.image = myImage;
,這工作得很好。但名爲「myImage」的對象從未初始化,並且UIImage從未分配過任何內存,但代碼仍然有效。
有人可以解釋這裏發生了什麼嗎?
是的,對象被初始化。 imageNamed:
方法分配並初始化一個對象,發送一個autorelease
消息,然後將內存地址返回給您。您將該內存地址存儲在名爲myImage
的指針中。
myImage
和對象是兩個不同的東西。 myImage
只是指向一個內存位置。這不是對象本身。
您可以傳遞對象而不將它們分配給變量,並且可以將一個對象分配給多個變量。
考慮一下:
UIImage *imageOne;
UIImage *imageTwo;
imageOne = [UIImage imageNamed:@"myPhoto.jpg"];
imageTwo = imageOne;
的形象,不是複製。只有一個對象存在。兩個變量都指向它。
現在考慮這個:
NSLog(@"%@", [UIImage imageNamed:@"myPhoto.jpg"]);
你沒把它分配給任何變量。但是對象仍然存在,對吧?
看看documentation爲UIImage
。在「高速緩存的圖像加載例程」和「創建新圖像」的標題下,有一些方法,其中+
可能需要-
。這意味着調用這些方法與調用[[[UIImage alloc] init] autorelease];
相同,儘管其中一些方法可以執行更多操作(如自定義初始化中那樣)。
許多其他Objective C對象具有相似的方法,例如,NSArray
有一個方法+(id)array
,該方法創建並返回一個空數組。您的主要指標是+
而不是-
,但我經常檢查文檔以檢查初始化是如何處理的,並確保對象是自動釋放的。
這些被稱爲「便利方法」。可可有[非常一致的約定](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership。html)知道Cocoa方法返回的對象的內存管理規則,所以一旦你知道規則,檢查每種方法的文檔是不必要的。 '+'vs'-'表示一個方法是類方法還是實例方法,它與這個問題沒有直接關係。 – Jim
這就是開眼界。謝謝。 所以最後一個問題......對象究竟是什麼,我一直認爲指針是對象。例如.. NSString * myString = [[NSString alloc] initWithString:@「Hello」]; 我認爲* myString將是對象。 – Sean
指針是一個指針。指針指向對象。兩個指針可以指向同一個對象。得到它了? – Yuji
Ohhhhh ..哈哈,謝謝。我愛你們。我現在明白了。這使得現在更容易一些。 – Sean