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

我是一个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分配的是堆内存。属性所占内存会不会被分配?不太理解这句话的意思。既然已经占了内存,那必然是已经分配给它了。

いいねを押す+0
    洪涛

    现在iOS开发已经不需要去用@synthesize了,当你添加一个属性后,系统会自动的添加与该属性同名且带下划线的实例变量,并且自动生成这个实例变量的setter和getter方法。

    stringWithFormat 类似方法可以返回一个实例,接受的变量不需要alloc 和 init。
    //OC中有类方法和实例方法两类,类方法调用后会返回一个对象,相当于执行了alloc+init操作

    有关属性、对象的概念你可以访问下我的博客(www.hcios.com),搜索:属性、对象可以得到详细解答。

    いいねを押す+0
      左手右手慢动作

      你调用的NSString的 stringWithFormat 和NSfont 的方法 都是类方法,你可以看下什么是实例方法 什么是类方法

      いいねを押す+0
        最新のダウンロード
        詳細>
        ウェブエフェクト
        公式サイト
        サイト素材
        フロントエンドテンプレート
        私たちについて 免責事項 Sitemap
        PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!