簡體   English   中英

何時在Objective-C中使用alloc init

[英]When to use alloc init in objective-c

大家好,我只是一個簡單的客觀問題,我一直在研究公司的代碼庫,偶然發現了一些有趣的東西。 什么時候應該使用[[alloc] init],什么時候不應該使用。 這是一個經典的例子:

情況1:

NSString *url = nil;
url = @"hi";

情況2:

NSString *url = [[NSString alloc] init];
url = @"hi";

那么什么時候應該使用案例1,什么時候應該使用案例2? 我希望有人可以一勞永逸地解決這個問題,在我一直使用Case 2的整個應用程序開發中,因為我認為這等同於在C ++中調用“ new”(基本上是調用對象構造函數)。 我對案例1甚至可以工作感到震驚,因為案例1表示沒有調用該對象的構造函數或內存分配。 情況1在我正在查看的代碼庫中無處不在。

alloc創建存儲並執行一些基本的自動設置,並返回該類的實例。 init允許實例根據該類所需的邏輯進行自身配置。 =將不同的實例分配給指針。

因此,第一個總是正確的,第二個總是不正確的。 創建對象實例然后將其扔掉一行沒有意義。

(此外:使用ARC時,您總是可以跳過= nil的含義;根據您的情況,由於以下分配,您可以跳過它)

@“ hi”創建NSString的實例。 它進行分配和初始化。 因此,在情況2中,您毫無意義地分配了內存,然后將“ url”指針重新分配給新的內存。

您必須記住“ url”是一個指針。 就像在C或C ++中一樣,當您使用“ =”運算符時,您正在重新分配它所指向的位置,而不會影響它以前指向的內存。 在C語言中,如果要更改存儲在新分配的內存中的值,則必須使用解引用運算符。

alloc創建一個對象。 因此,當您要創建類的實例時可以使用它。 在這種情況下,您不想創建對象,因為您將要把現有對象@“ hi”分配給變量。 因此,您永遠都不會編寫案例2,因為它會創建一個對象並立即將其丟棄給另一個對象。

暫無
暫無

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

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