ios - alloc 和 init 和synthesize 等内存分配的疑惑?
ringa_lee
ringa_lee 2017-04-17 17:31:37
0
3
346

我是一个OC的初学者,有一定的C++基础,学习OC(目前版本)最大的感觉是过于自动化,导致理解有断层。比如,实例变量的隐藏。。让我困惑了许久。。
特别是对于内存这一块,

  • 比如@synthesize 自动生成的getter & setter 是否可以正确的初始化堆上的属性。

  • stringWithFormat 类似方法可以返回一个实例,接受的变量不需要alloc 和 init。

  • NSFont 使用的时候,不可以alloc 和 init。

基于以上疑惑,引出我很低级的发问的。

  1. 所有堆上的属性,都需要在setter 或 getter 进行内存分配(无论是alloc init,或者像stringWithFormat 这样的也可以)

  2. @synthesize 自动生成的getter & setter 是不是仅仅生成 _value = value这段代码。对堆上的属性是不好用的

  3. 对于类使用alloc,alloc 究竟分配了什么内存?属性所占得内存会不会被分配。

ringa_lee
ringa_lee

ringa_lee

全部回覆(3)
刘奇

沒用過c++,可能get不到你疑惑的點。
1.記憶體的分配從來都不是在setter或getter方法裡,alloc才是。
@synthesize是告訴編譯器幫忙產生setter和getter方法,現行版本預設使用了@synthesize,所以現在並不使用類似 @synthesize value=_value這樣的寫法了。而之前這樣寫是告訴編譯器,當我要訪問value屬性的時候,請去訪問_value這個ivar,具體可參考這裡:http://stackoverflow.com/questions/3266467/what-exactly-does-synthesize -do
2.stringWithFormat是類別方法,內部已經呼叫了alloc和init,和NSFont不使用alloc和init道理相似,外部提供的介面都是已經在方法實作裡面呼叫過了alloc和init,如果你實在要呼叫也是可以呼叫的,不存在不可以。 NSFont *f = [[NSFont alloc] init];這樣的程式碼是沒問題的。
3.alloc分配的是堆記憶體。屬性所佔記憶體會不會被分配?不太理解這句話的意思。既然已經佔了內存,那必然是已經分配給它了。

洪涛

現在iOS開發已經不需要去用@synthesize了,當你添加一個屬性後,系統會自動的添加與該屬性同名且帶下劃線的實例變量,並且自動生成這個實例變量的setter和getter方法。

stringWithFormat 類似方法可以傳回一個實例,接受的變數不需要alloc 和 init。
//OC中有類別方法和實例方法兩類,類別方法呼叫後會傳回一個對象,相當於執行了alloc+init操作

有關屬性、物件的概念你可以造訪下我的部落格(www.hcios.com),搜尋:屬性、物件可以詳細解答。

左手右手慢动作

你呼叫的NSString的 stringWithFormat 和NSfont 的方法 都是類別方法,你可以看下什麼是實例方法 什麼是類別方法

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!