iOS 初始化方法 alloc init 與 new 的區別
class * aclass = [[class alloc]init];
這行程式碼被我們寫了無數遍,同時幾乎所有人都知道
class * aclass = [class new];
的存在。
那麼 [[class alloc]init]
和[class new]
到底有什麼區別呢?該如何使用呢?
照例開扒文件
Allocates a new instance of the receiving class, sends it an init message, and returns the initialized object.
分配出一個接受類的新例項,向這個例項傳送一個 init 訊息,然後返回一個該類的初始化物件。This method is a combination of alloc and init.
這個方法是 alloc 和 init 的一個組合。
可以看到,[class new]
只是將[[classalloc] init]
組合了起來 ,同樣都是分配記憶體完成物件初始化。那麼他們有什麼不同的地方呢?
上程式碼
+ new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
return [newObject init];
else
return newObject;
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
- init
{
return self;
}
可以看到的一個區別是
alloc 分配記憶體時使用的是(*_zoneAlloc)((Class)self, 0, malloc_default_zone())
。
這串東西的演化是這樣的:
+ allocFromZone:(void *) z
{
return (*_zoneAlloc)((Class)self, 0, z);
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
關於這個方法查詢到的是,在給物件分配記憶體的時候,把關聯的物件分配到一個相鄰的記憶體區域內,以便於呼叫時消耗很少的代價,提升了程式處理速度(其實還是分配記憶體而已)。
另外一個區別則是,[class new]
裡在傳送初始化訊息時使用的是 init,也就是說我們無法呼叫一個類的 initWithxxx方法。
so,[class new]
並沒有什麼奇特,只不過是讓你少寫了幾個字母。
總結下來,[class new]
和[[classalloc] init]
幾乎是一致的,分配記憶體建立例項然後傳送 init 訊息完成一個類的例項化。
使用[class new]
會更省事,更簡潔,但是隻能呼叫 init 方法,無法使用其他自定義的初始化方法。
使用[[class alloc] init]
,顯式的呼叫 分配記憶體 和 初始化 方法,同時也可以實現 initxxxx。
相關文章
- __new()__ 與 __init()__的區別
- Python __new__ 和 __init__ 的區別Python
- Python中__new__和__init__的區別與聯絡Python
- Python語言中__init__與__new__的區別是什麼?Python
- Python面試之理解__new__和__init__的區別Python面試
- 00 #### `__init__` ,初始化方法
- iOS探索 alloc流程iOS
- 一問搞懂python的__init__和__new__方法Python
- PHP new self()和new static()的區別PHP
- iOS isKindOfClass與isMemberOfClass的區別iOS
- 由 NSObject *obj = [[NSObject alloc] init] 引發的一二事兒Object
- Django __init__ 方法用於初始化Django
- Go 中 make 與 new 的區別是什麼?Go
- spring的延遲初始化bean (default-lazy-init 與 lazy-init )SpringBean
- 簡述Python類中的 __init__、__new__、__call__ 方法Python
- Golang make和new的區別Golang
- wait()方法與await()方法的區別AI
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- 面試官:Golang 的 new 與make 區別是什麼?面試Golang
- new 和 malloc 的區別 及使用
- iOS 指定初始化方法iOS
- 50-cloud-init.yaml 和80-cloud-init.yaml區別CloudYAML
- springdatajpa 中get××方法與find××方法的區別Spring
- jquery中append()方法與after()方法的區別jQueryAPP
- ScheduledExecutorService中scheduleAtFixedRate方法與scheduleWithFixedDelay方法的區別
- python中__init__ 和__new__的對比Python
- python 詳解類class的繼承、__init__初始化、super方法Python繼承
- 一句話說明白C#中的new與override的區別C#IDE
- golang中的init初始化函式Golang函式
- 字元裝置驅動學習之cdev_init和cdev_alloc字元dev
- python中的__init__ 、__new__、__call__小結Python
- over fit與underfit的區別與解決方法
- 字串的match方法與正則的exec方法的區別字串
- Array()與Array.of()方法區別
- 細說new和malloc的十大區別
- 從原始碼角度看蘋果是如何實現 alloc、new、copy 和 mutablecopy 的原始碼蘋果
- k8s中初始化容器(init container)的作用及其使用方法K8SAI
- Java基礎-- ==號與equals()方法的區別Java
- python函式與方法的區別總結Python函式