objective-cでnewとalloc/initの違い

3642 ワード

英語の詳細:http://macresearch.org/difference-between-alloc-init-and-new
1.実際の開発ではnewはあまり使われません.一般的に作成したオブジェクトは全部[classis Name alloc]init]です.
ただし、newに接触しないという意味ではなく、いくつかのコードの中に「class Name new」が見られます.
また面接に行く時も、この問題を聞かれる可能性があります.
2.では、彼らの間にはどんな違いがありますか?
ソースコードを見ます
 



 
 
 
 
 
  
  
  
  
  1. new 
  2. id newObject = (*_alloc)((Class)self, 0); 
  3. Class metaClass = self->isa; 
  4. if (class_getVersion(metaClass) > 1) 
  5. return [newObject init]; 
  6. else 
  7. return newObject; 
  8.  
  9. //  alloc/init  : 
  10. + alloc 
  11. return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());  
  12. - init 
  13. return self; 
ソースコードの中で私達は発見しました.「className new」は基本的に「class Name alloc」initに相当します.
違いはallocだけでメモリを割り当てる時にzoneを使いました.
このzoneは何ですか?
対象にメモリを割り当てる時、関連する対象を隣接するメモリエリアに割り当てて、呼び出し時の消費量が少ないため、プログラム処理速度を向上させました.
3.newはなぜオススメしないですか?
newを使えば、初期化方法が固定されていますので、initを呼び出すしかありません.
initXXXを呼び出したいですが、どうすればいいですか?見込みがない最初のデザインはSmalltalkの文法を完全に参考にしたものだそうです.
その時すでにallocFroomZoneがあったと伝えられています.
しかし、この方法はパラメータID myComponen=[The Class allocFroomZone];
この方法は次のようになります.
 



 
 
 
 
 
  
  
  
  
  1. + allocFromZone:(void *) z 
  2. return (*_zoneAlloc)((Class)self, 0, z);  
  3.  
  4. // : 
  5. + alloc 
  6. return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());  
しかし、問題があります.この方法は対象にメモリを割り当てただけで、インスタンス変数を初期化していません.
またnewのような処理方式に戻るのではないですか?方法の内部に隠れてinitを呼び出す方法ですか?
その後、「表示呼び出しは常に暗黙的な呼び出しより良い」ということが分かりました.
概括的に、newとalloc/initは機能的にほぼ一致し、メモリを割り当てて初期化を完了する.
違いは、new方式ではデフォルトのinit方式でのみ初期化が完了し、
allocの方式を採用して、他のカスタムの初期化方法を使うことができます.