Bagaimana cara mengkonversi NSMutableArray ke NSArray di objektif-c?
NSArray *array = mutableArray;
Bagaimana cara mengkonversi NSMutableArray ke NSArray di objektif-c?
NSArray *array = mutableArray;
Jawaban:
NSArray *array = [mutableArray copy];
Copy
membuat salinan yang tidak dapat diubah. Ini cukup berguna karena Apple dapat melakukan berbagai optimasi. Misalnya mengirim copy
ke array yang tidak dapat diubah hanya mempertahankan objek dan kembali self
.
Jika Anda tidak menggunakan pengumpulan sampah atau ARC ingat bahwa -copy
mempertahankan objek.
copy
menciptakan NSArray normal dan bukan NSMutableArray?
NSArray
& NSMutableArray
, NSString
& NSMutableString
. Tapi tidak misalnya NSViewController
yang selalu berisi keadaan bisa berubah.
An NSMutableArray
adalah subkelas NSArray
sehingga Anda tidak perlu selalu mengonversi tetapi jika Anda ingin memastikan bahwa array tidak dapat dimodifikasi, Anda dapat membuat NSArray
salah satu dari cara ini tergantung pada apakah Anda ingin autoreleased atau tidak:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
EDIT: Solusi yang disediakan oleh Georg Schölly adalah cara yang lebih baik untuk melakukannya dan jauh lebih bersih, terutama sekarang kita memiliki ARC dan bahkan tidak perlu memanggil autorelease.
Saya menyukai kedua solusi utama:
NSArray *array = [NSArray arrayWithArray:mutableArray];
Atau
NSArray *array = [mutableArray copy];
Perbedaan utama yang saya lihat di dalamnya adalah bagaimana mereka berperilaku ketika mutableArray nihil :
NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)
NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
[mutableArray copy]
dapat disederhanakan menjadi [nil copy]
. Dalam tujuan-c setiap pesan yang dikirim ke nil akan selalu nihil. Sangat penting untuk mengingat perbedaan antara "tidak ada" dan "array tanpa apa pun di dalamnya".
Anda mencoba kode ini ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
dan
NSArray *myArray = [myMutableArray copy];
Di bawah ini adalah cara untuk mengkonversi NSMutableArray ke NSArray:
//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];
//Make copy of array
NSArray *newArray2 = [oldArray copy];
//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];
//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;
Di Swift 3.0 ada tipe data baru Array . Deklarasikan Array menggunakan let
kata kunci maka akan menjadi NSArray Dan jika menyatakan menggunakan var
kata kunci maka itu menjadi NSMutableArray .
Kode sampel:
let newArray = oldArray as Array
Dalam tujuan-c:
NSArray *myArray = [myMutableArray copy];
Dengan cepat:
var arr = myMutableArray as NSArray
NSArray *array = mutableArray;
[mutableArray copy]
Antipattern ini adalah seluruh kode sampel. Berhentilah melakukannya untuk array yang dapat dipindahkan yang sementara yang transien dan dapatkan deallocated pada akhir lingkup saat ini.
Tidak ada cara runtime dapat mengoptimalkan pemborosan dari array yang bisa berubah yang baru saja akan keluar dari ruang lingkup, didekomposisi menjadi 0 dan dialokasikan untuk selamanya.
NSMutableArray
ke suatu NSArray
variabel tidak akan menyamarkannya (yang merupakan pertanyaan OP tentang). Mengekspos nilai seperti itu (misalnya sebagai nilai balik atau sebagai properti) dapat mengakibatkan masalah yang sangat sulit untuk di-debug jika nilai itu secara tak terduga bermutasi. Ini berlaku untuk mutasi internal dan eksternal karena nilai yang dapat diubah dibagikan.
NSMutableArray
variabel sudah cukup. Karena objek tidak pernah berhenti menjadi array yang dapat diubah, memanggil metode yang bermutasi padanya akan berhasil dan mengubah data yang dibagikan. Jika di sisi lain array yang dapat diubah asli disalin — mengubahnya ke array yang tidak dapat diubah - dan kemudian ditugaskan ke NSMutableArray
variabel dan memiliki metode mutasi yang memanggilnya, panggilan tersebut akan gagal dengan doesNotRespondToSelector
kesalahan karena objek yang menerima panggilan metode mutasi ada di Bahkan tidak berubah dan tidak menanggapi metode-metode itu.
Jika Anda membuat array melalui mutabilitas dan kemudian ingin mengembalikan versi yang tidak dapat diubah, Anda bisa mengembalikan array yang bisa diubah sebagai "NSArray" melalui pewarisan.
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
Jika Anda "mempercayai" penelepon untuk memperlakukan objek kembali (secara teknis masih bisa berubah) sebagai NSArray yang tidak berubah, ini adalah opsi yang lebih murah daripada [mutableArray copy]
.
Untuk menentukan apakah itu dapat mengubah objek yang diterima, penerima pesan harus bergantung pada tipe formal nilai pengembalian. Jika ia menerima, misalnya, objek array yang diketik sebagai tidak dapat diubah, ia tidak boleh mencoba untuk mengubahnya . Ini bukan praktik pemrograman yang dapat diterima untuk menentukan apakah suatu objek dapat diubah berdasarkan keanggotaan kelasnya.
Praktik di atas dibahas secara lebih rinci di sini:
Praktik Terbaik: Kembalikan mutableArray.copy atau mutableArray jika jenis kembali adalah NSArray
NSArray *array = [mutableArray copy];