簡體   English   中英

Objective-C:對象實例指針

[英]Objective-C: object instance pointers

我是Objective-C的新手,正在努力吸引指針。 這不是我的第一站電話。 我希望有人能夠辨別出我的困惑,並以通俗的英語解釋這個概念。

在以下代碼中(從Treehouse課程中),創建了一個對象類Sphere的實例球。

#import <Cocoa/Cocoa.h>
#import "Sphere.h"

int main()
{
Sphere *ball = [[Sphere alloc] init];

[ball setRadius:25];

NSLog(@"ball radius %f", [ball radius]);

return 0;
}

我了解在Objective-C中,對象類的所有實例都是指針。

我理解“球指針指向為球對象分配的內存”,正如其他人在我這里指出的那樣。

但是在實際的內存分配方面發生了什么?

“實例”和“指針”是同時創建的嗎?

Sphere *ball

這樣會分配一些內存,足以容納一個指針。 (在堆棧上)

[Sphere alloc]

這會在其他地方(堆中)分配足夠大的內存以適合Sphere類的實例,並將所有實例變量設置為0。它返回為對象分配的空間的地址(換句話說,指向新指針的指針)。賓語)。

[[Sphere alloc] init]

然后,init方法將初始化所有字段並進行其他初始化。 (假設您已在Sphere中覆蓋了init,則在NSObject中實現init不會執行任何操作)。 這與為對象本身在內存中分配空間無關,盡管它通常為對象引用的其他對象分配空間。 它返回對象的內存地址,大多數情況下,它與alloc返回的地址相同。

然后,由[[Sphere alloc] init]返回的內存地址存儲在ball變量中。 (通過=

指針只是一個數字,對應於存儲位置的存儲地址。 對象是類的實例,並且對象是指為該對象分配的實際內存。

實例指針並非100%相同,盡管在代碼中它們都由ball變量表示。

您的問題的答案可以在以下行中找到:

Sphere *ball = [[Sphere alloc] init];

讓我們仔細看看,此行包含兩個方法調用: allocinit

alloc是在NSObject實現的類方法,在文檔中描述如下: 返回接收類的新實例。

這意味着此時,操作系統將為Sphere類型的對象分配內存。

init初始化程序,並在文檔中進行了如下描述: 由子類實現,以在為其分配內存后立即初始化新對象(接收方)。 您可以在Sphere類的實現中重寫此方法以執行您自己的修改(通常在此處為類的屬性設置值)。

執行完此行代碼之后,您已經1.為Sphere類的實例分配了物理內存,並且2.初始化了相同的實例。 這意味着該實例(或object ,這些術語等效)現在可以使用了。

希望這可以幫助!

暫無
暫無

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

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