object cにおけるnewとallocの違い

3056 ワード

object-c基礎教程という本の中でいつも次のようなコードを見ることができて、私のこのおかずの鳥は退屈して、どんな違いがあって、同じように見えますか.ネットで探して、いくつかの言い方を見つけて、ここで先に取り出します.    className* object = [className new]; or     className* object = [[className alloc] init]; 背景の説明では、newは比較的古い書き方で、後に1つのnewだけが使いにくいことを発見して、allocとinitのこのような書き方を導入して、newを保留して1つは後ろに互換性があって、2つは多くの時1種のもっと簡単な書き方です.実は同じですnewが内部で呼び出したallocと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; }


[className new]は[[className alloc]init]とほぼ同等である.違いはallocがメモリを割り当てるときにzoneを使っただけで、このzoneは何ですか?これは、オブジェクトにメモリを割り当てる場合に、関連するオブジェクトを隣接するメモリ領域に割り当てることで、呼び出す際の消費が少ないため、プログラムの処理速度を向上させる.allocとinitを分けるのは何ですか?1.複数のinitメソッドを用いることができる.暗黙的な呼び出しよりも呼び出しの方が良いと表示されます.initWithStringのような他のinit関数を使用する必要がない場合は、[Nsobject alloc]initを使用するだけです.newの方法を使用すると便利です.*new doesn't support custom initializers(like initWithString)*alloc-init is more explicit than new