Saya perlu menyalin objek khusus yang memiliki objeknya sendiri. Saya telah membaca dan agak bingung tentang cara mewarisi NSCopying dan cara menggunakan NSCopyObject.
objective-c
copy
ben
sumber
sumber
Jawaban:
Seperti biasa dengan jenis referensi, ada dua pengertian tentang "salinan". Saya yakin Anda tahu mereka, tapi untuk kelengkapan.
Anda menginginkan yang terakhir. Jika ini adalah salah satu objek Anda, Anda hanya perlu mengadopsi protokol NSCopying dan menerapkan - (id) copyWithZone: (NSZone *) zona. Anda bebas melakukan apa pun yang Anda inginkan; meskipun idenya adalah Anda membuat salinan asli dari diri Anda dan mengembalikannya. Anda memanggil copyWithZone di semua bidang Anda, untuk membuat salinan dalam. Contoh sederhananya adalah
sumber
autorelease
melakukannya, atau apakah saya melewatkan sesuatu di sini?copyWithZone:
memenuhi kriteria ini, oleh karena itu harus mengembalikan objek dengan jumlah retensi +1.alloc
daripadaallocWithZone:
sejak zona itu dilewati?allocWithZone
.copy
,mutableCopy
dancopyWithZone
, terkait dengan salah satu jawaban, ada di sini.Dokumentasi Apple mengatakan
untuk menambah jawaban yang ada
sumber
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Saya kira ini hanya diperlukan ketika kita mewarisi dari beberapa kelas khusus lain yang mengimplementasikancopyWithZone
Saya tidak tahu perbedaan antara kode itu dan milik saya, tetapi saya memiliki masalah dengan solusi itu, jadi saya membaca lebih banyak dan menemukan bahwa kita harus mengatur objek sebelum mengembalikannya. Maksud saya sesuatu seperti:
Saya menambahkan jawaban ini karena saya memiliki banyak masalah dengan masalah ini dan saya tidak tahu mengapa itu terjadi. Saya tidak tahu perbedaannya, tetapi ini berhasil untuk saya dan mungkin juga berguna untuk orang lain :)
sumber
Saya pikir, baris ini menyebabkan kebocoran memori, karena Anda mengakses
obj
melalui properti yang (saya asumsikan) dinyatakan sebagairetain
. Jadi, jumlah retensi akan ditingkatkan berdasarkan properti dancopyWithZone
.Saya percaya itu harus:
atau:
sumber
Ada juga penggunaan operator -> untuk menyalin. Sebagai contoh:
Alasan di sini adalah objek yang disalin harus mencerminkan keadaan objek aslinya. The "." operator dapat memperkenalkan efek samping karena yang satu ini memanggil getter yang pada gilirannya mungkin berisi logika.
sumber