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.では、彼らの間にはどんな違いがありますか?
ソースコードを見ます
違いはallocだけでメモリを割り当てる時にzoneを使いました.
このzoneは何ですか?
対象にメモリを割り当てる時、関連する対象を隣接するメモリエリアに割り当てて、呼び出し時の消費量が少ないため、プログラム処理速度を向上させました.
3.newはなぜオススメしないですか?
newを使えば、初期化方法が固定されていますので、initを呼び出すしかありません.
initXXXを呼び出したいですが、どうすればいいですか?見込みがない最初のデザインはSmalltalkの文法を完全に参考にしたものだそうです.
その時すでにallocFroomZoneがあったと伝えられています.
しかし、この方法はパラメータID myComponen=[The Class allocFroomZone];
この方法は次のようになります.
またnewのような処理方式に戻るのではないですか?方法の内部に隠れてinitを呼び出す方法ですか?
その後、「表示呼び出しは常に暗黙的な呼び出しより良い」ということが分かりました.
概括的に、newとalloc/initは機能的にほぼ一致し、メモリを割り当てて初期化を完了する.
違いは、new方式ではデフォルトのinit方式でのみ初期化が完了し、
allocの方式を採用して、他のカスタムの初期化方法を使うことができます.
1.実際の開発ではnewはあまり使われません.一般的に作成したオブジェクトは全部[classis Name alloc]init]です.
ただし、newに接触しないという意味ではなく、いくつかのコードの中に「class Name new」が見られます.
また面接に行く時も、この問題を聞かれる可能性があります.
2.では、彼らの間にはどんな違いがありますか?
ソースコードを見ます
- + new
- {
- id newObject = (*_alloc)((Class)self, 0);
- Class metaClass = self->isa;
- if (class_getVersion(metaClass) > 1)
- return [newObject init];
- else
- return newObject;
- }
-
- // alloc/init :
- + alloc
- {
- return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
- }
- - init
- {
- return self;
- }
ソースコードの中で私達は発見しました.「className new」は基本的に「class Name alloc」initに相当します.違いはallocだけでメモリを割り当てる時にzoneを使いました.
このzoneは何ですか?
対象にメモリを割り当てる時、関連する対象を隣接するメモリエリアに割り当てて、呼び出し時の消費量が少ないため、プログラム処理速度を向上させました.
3.newはなぜオススメしないですか?
newを使えば、初期化方法が固定されていますので、initを呼び出すしかありません.
initXXXを呼び出したいですが、どうすればいいですか?見込みがない最初のデザインはSmalltalkの文法を完全に参考にしたものだそうです.
その時すでにallocFroomZoneがあったと伝えられています.
しかし、この方法はパラメータID myComponen=[The Class allocFroomZone];
この方法は次のようになります.
- + allocFromZone:(void *) z
- {
- return (*_zoneAlloc)((Class)self, 0, z);
- }
-
- // :
- + alloc
- {
- return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
- }
しかし、問題があります.この方法は対象にメモリを割り当てただけで、インスタンス変数を初期化していません.またnewのような処理方式に戻るのではないですか?方法の内部に隠れてinitを呼び出す方法ですか?
その後、「表示呼び出しは常に暗黙的な呼び出しより良い」ということが分かりました.
概括的に、newとalloc/initは機能的にほぼ一致し、メモリを割り当てて初期化を完了する.
違いは、new方式ではデフォルトのinit方式でのみ初期化が完了し、
allocの方式を採用して、他のカスタムの初期化方法を使うことができます.