2011-10-27 51 views
0

假設我有在.h中聲明的UIView viewLoading。我不直接初始化它(在第一個代碼中)。內存管理分配不直接分配

第一個代碼。

UIView *viewLoading2 = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]]; 
viewLoading = viewLoading2; 
[viewLoading2 release] 

第二個代碼:

viewLoading = [[[UIView alloc] initWithFrame:CGRectMake(75 , 155, 170.0, 170.0)]]; 

第三碼:

- (void) viewLoad:(UIView *) viewLoading2 
{ 
    viewLoading = viewLoading2; 
    //do i need to retain, alloc, or release something here? 

} 
  1. 2在第一個代碼,做我需要釋放viewLoading在dealloc的?如果我不申報財產,會發生什麼?

  2. 在第二碼,它有與所述第一碼相同的效果? (需要dealloc或不)。

  3. 對於第三碼,它具有與第一代碼相同的效果?我編碼後該怎麼辦? (見註釋)

  4. 待辦事項iPhone的代碼始終需要有在.H聲明可變釋放?或者只有在.h中聲明的變量被分配了?如果像在第一個代碼中那樣,我是否需要dealloc viewLoading?

  5. 什麼是

    之間的不同

    self.viewloading = viewLoading2;

viewloading = viewLoading2; 

感謝

回答

3

在第一個例子,你分配的對象(一次),並鬆開手(一次),所以你不需要做任何事其他。另一方面,只要您將版本發送到viewLoading2,viewLoading就無效,因此它不是非常有用的代碼。

在第二個,你還沒有發佈viewLoading,所以它確實需要最終完成。

在第三,任何代碼分配這是通過參數傳遞到該方法中,對象是負責釋放它。它在這個方法的持續時間內應該是有效的,但是如果你保存它以備後用,你需要在這裏保留它,然後在你完成時釋放它。

編輯:

我不知道我理解你的問題4.在接口(.h)文件中的聲明只是預留空間的指針。它不是一個對象聲明,所以在實際執行對象分配之前,不需要發佈任何內容。

self.viewloading = viewLoading2使用特性設置器方法來執行分配。如果@property語句具有「保留」,則保留將作爲該分配的一部分完成。 `viewloading = viewLoading2" 是直的分配也沒有保留。

+0

您好,感謝您的答案。因此,在第一個代碼,它是無效的或不?因爲你說「只要你發送relese到viewLoading2,其不是很有用的代碼「。viewLoading2不保留viewLoading嗎?我需要做viewLoading發佈嗎? 對於第二個代碼,我可以將發佈版本留給dealloc嗎? –

+0

我也編輯了我的問題。也許你可以回答它:D –

+0

讓我澄清我的代碼1的答案。它是有效的語法,沒有內存泄漏,但它是無用的代碼,因爲viewLoading指向一個已經發布的對象。你在賦值語句中所做的只是讓兩個指針指向同一個對象,然後再發布。所以他們都指向一個不再有有效對象的內存位置。 – Flyingdiver