簡體   English   中英

分配+初始化內存使用機制

[英]alloc + init memory usage mechanism

我只是很好奇,知道何時由alloc了對象,並為其分配了一塊內存,為什么init不使用該內存並更改對象的地址?

NSDate *t = nil;
NSLog(@"t = %p",t); // t = 0x0 

t = [NSDate alloc];
NSLog(@"t = %p",t); // t = 0x100107af0

t = [t init];
NSLog(@"t = %p",t); // t = 0x1001035a0

兩步初始化使我們可以做這些事情(即,根據所調用的初始化程序,將一個類的實例替換為另一個實例)。 Foundation和UIKit上的整個類集群都利用這一點來返回針對特定用例優化的實例。 例如, UIColor本身只是其子類的接口,這些子類實現了顏色緩存(所有已命名的初始化方法,如+blackColor ),RGB顏色空間( +colorWithRed:green:blue:alpha ),黑白顏色空間( +colorWithWhite:alpha: ), CIColor兼容性等等等NSDate過。 當您調用-init ,Apple有手段和動機返回實現與NSDate相同的接口作為優化的另一個對象,因為說實話,只要您不嘗試發射任何東西,只要它不發射導彈,您就不會在意正確發送消息。

從最新的iOS SDK開始,調用[NSDate alloc]始終返回相同的內存位置。 您可以使用以下代碼驗證此行為:

NSDate *date1, *date2;
date1 = [NSDate alloc];
NSLog(@"date1: %p", date1);
date1 = [date1 init];
NSLog(@"date1: %p", date1);
date2 = [NSDate alloc];
NSLog(@"date2: %p", date2);
date2 = [date2 init];
NSLog(@"date2: %p", date2);

我懷疑這與NSDate是一個類集群這一事實有關。

如果類群集的私有子類具有不同的存儲要求,則不可能在alloc內部知道要分配多少內存。 解決此問題的一種方法,看來這是Apple與NSDate使用的方法,是讓init和factory方法處理所有內存分配,因為這些方法知道實際上將使用什么私有子類。

到那時,所有alloc都為您做着,就是允許用戶保留用於[[NSDate alloc] init] Objective-C中各處創建對象的[[NSDate alloc] init]模式[[NSDate alloc] init] 由於alloc返回的內存位置始終被丟棄,因此alloc也可能只返回固定的內存位置,這似乎是在做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM