Inisialisasi NSMutableArray: [Array NSMutableArray];

Jika Anda menginisialisasi NSMutableArray dengan metode praktis NSArray seperti di atas, apakah Anda mendapatkan NSArray atau NSMutableArray?

Ada konsekuensinya?

(Saya tahu NSMutableArray memiliki "arrayWithCapacity:, saya hanya ingin tahu)


person Corey Floyd    schedule 09.05.2009    source sumber
comment
Saya menghargai diskusi menarik di bawah ini untuk pertanyaan sederhana. Ini membawa beberapa poin Kakao yang halus.   -  person Corey Floyd    schedule 12.05.2009


Jawaban (2)


Jika Anda menginisialisasinya menggunakan:

NSMutableArray *array = [NSMutableArray array];

Anda mendapatkan NSMutableArray. Salah satu fitur hebat dari Objective-C adalah bahwa metode kelas diwarisi oleh subkelas.

Jadi, dalam metode kelas Anda bisa melakukan sesuatu seperti ini:

+(id)array {
    return [[[self alloc] init] autorelease];
}

dan self akan merujuk ke objek kelas tempat kode dieksekusi (NSArray atau NSMutableArray).

person pgb    schedule 09.05.2009
comment
ahh, menarik. jadi referensi sendiri Objek Kelas: NSMutableArray. Itu masuk akal. Saya bertanya-tanya mengapa kode saya tidak rusak! - person Corey Floyd; 10.05.2009
comment
Saya pikir Anda sebenarnya akan melakukan: return [[[self alloc] init] autorelease]; - person Don McCaughey; 10.05.2009

Pembaruan: Meskipun saran saya untuk "mengujinya sendiri" secara umum merupakan ide yang bagus, dalam kasus ini saran saya sedikit menyenangkan. Terima kasih kepada Jim di komentar karena menunjukkan bahwa saran saya di bawah ini tidak berfungsi dengan baik untuk kelas-kelas ini, karena berbagai bentuk NSArray semuanya diimplementasikan oleh kelas penghubung bebas pulsa CoreFoundation.

----- Jawaban Asli Untuk Konteks Di Bawah -----

Cara termudah untuk menjawab pertanyaan seperti ini adalah dengan mengujinya sendiri. Coba alokasikan array sesuai keinginan Anda, lalu NSLog dari kode Anda:

NSLog(@"Kami mendapat %@", NSStringFromClass([kelas Array]));

person danielpunkass    schedule 10.05.2009
comment
Tentunya itu akan selalu mengembalikan NSCFArray? - person Jim Dovey; 12.05.2009
comment
Poin bagus, Jim. Saya lupa tentang kekhasan NSArray itu. Mengedit tanggapan saya di atas. Terima kasih. - person danielpunkass; 12.05.2009
comment
Hmm menarik. Jadi bahkan NSMutableArray akan mengembalikan NSCFArray? Hal ini membuat sulit untuk melakukan introspeksi dan mencari tahu apakah Anda memiliki objek yang bisa berubah sebelum mencoba mengubahnya. Saya kira Anda dapat melakukan respondsToSelector dalam hal ini. Sebagai tambahan, terima kasih atas podcast Anda yang luar biasa. Saya telah kembali dan mendengarkan sebagian besar episode Anda dan Manton yang lalu. Cukup menghibur dan informatif. - person Corey Floyd; 12.05.2009
comment
Ya, menggunakan respondsToSelector sepertinya merupakan pendekatan yang masuk akal. Mungkin ada cara yang lebih baik untuk memeriksa perubahan, saya tidak tahu. Senang Anda menikmati podcastnya! - person danielpunkass; 12.05.2009
comment
Sayangnya itu tidak mungkin. NSCFArray mengimplementasikan satu set metode, dan itu tidak mengubah daftar itu jika itu adalah instance yang bisa berubah. Semua bagian dari hal-hal yang menjembatani bebas pulsa yang funky: NSCFArray sebenarnya adalah deskripsi kelas ObjC yang diterapkan pada instance CFArrayRef-- dengan kata lain, buat CFArrayRef, panggil [kelas ref], dan itu akan mengembalikan NSCFArray. Satu-satunya cara yang saya tahu untuk menguji mutabilitas dengan andal adalah dengan membungkusnya dalam blok coba/tangkap dan menangani NSInternalInconsistencyException yang akan dimunculkan jika tidak benar-benar bisa berubah. Itu atau gali sumber CF & periksa bit header CF ;) - person Jim Dovey; 12.05.2009
comment
Wow. Saya tidak dapat memikirkan contoh ketika saya sebenarnya tidak akan tahu apakah saya sedang berhadapan dengan objek yang bisa berubah, tapi itu jelas merupakan tarian yang bagus hanya untuk menentukan perubahan. Ini lebih dari sekedar latihan intelektual, tapi ini mengungkap masalah aneh yang bisa Anda hadapi dan menghabiskan waktu berjam-jam - person Corey Floyd; 13.05.2009