Bagaimana cara mengonversi (atau membuat) kelas tunggal yang mengkompilasi dan berperilaku dengan benar ketika menggunakan penghitungan referensi otomatis (ARC) di Xcode 4.2?
objective-c
ios
singleton
automatic-ref-counting
kue cescofry
sumber
sumber
Jawaban:
Dengan cara yang persis sama dengan yang Anda (seharusnya) sudah lakukan:
sumber
static
Variabel @vida yang dideklarasikan dalam suatu metode / fungsi sama denganstatic
variabel yang dideklarasikan di luar metode / fungsi, mereka hanya valid dalam lingkup metode / fungsi tersebut. Setiap menjalankan terpisah melalui+sharedInstance
metode (bahkan pada utas berbeda) akan 'melihat'sharedInstance
variabel yang sama .jika Anda ingin membuat instance lain sesuai kebutuhan. lakukan ini:
selain itu, Anda harus melakukan ini:
sumber
dispatch_once()
Bit berarti Anda tidak akan mendapatkan instance tambahan, bahkan dalam contoh pertama ...?[[MyClass alloc] init]
dan memotongsharedInstance
akses. DongXu, Anda harus melihat artikel Singleton karya Peter Hosey . Jika Anda akan menggantiallocWithZone:
untuk mencegah lebih banyak instance dibuat, Anda juga harus menggantiinit
untuk mencegah instance yang dibagi diinisialisasi ulang.allocWithZone:
versinya. Terima kasih.Ini adalah versi untuk ARC dan non-ARC
Cara Penggunaan:
MySingletonClass.h
MySingletonClass.m
sumber
Ini adalah pola saya di bawah ARC. Memenuhi pola baru menggunakan GCD dan juga memenuhi pola pencegahan instantiasi lama Apple.
sumber
c1
akan menjadi contoh dariAAA
superclass? Anda perlu memanggil+alloc
padaself
, bukan padasuper
.super
bukan berarti objek kelas-super. Anda tidak bisa mendapatkan objek kelas super Ini hanya berarti merutekan pesan ke versi metode kelas super.super
masih menunjukself
kelas. Jika Anda ingin mendapatkan objek super-kelas, Anda perlu mendapatkan fungsi refleksi runtime.-allocWithZone:
metode hanyalah rantai sederhana untuk fungsi alokasi runtime untuk menawarkan poin utama. Jadi pada akhirnya,self
pointer == objek kelas saat ini akan diteruskan ke pengalokasi, dan akhirnyaAAA
instance akan dialokasikan.super
bekerja dalam metode kelas.Baca jawaban ini dan kemudian pergi dan baca jawaban lainnya.
Anda harus terlebih dahulu tahu apa arti Singleton dan apa saja persyaratannya, jika Anda tidak memahaminya, maka Anda tidak akan mengerti solusinya - sama sekali!
Untuk membuat Singleton berhasil, Anda harus dapat melakukan 3 hal berikut:
dispatch_once_t
membantu Anda untuk memecahkan kondisi balapan dengan hanya membiarkan bloknya dikirim satu kali.Static
membantu Anda untuk "mengingat" nilainya di sejumlah doa. Bagaimana cara mengingatnya? Itu tidak mengizinkan instance baru dengan nama persis dari sharedAnstance Anda untuk dibuat lagi, itu hanya bekerja dengan yang baru saja dibuat.Tidak menggunakan panggilan
alloc
init
(yaitu kita masih memilikialloc
init
metode karena kita adalah subkelas NSObject, meskipun kita TIDAK boleh menggunakannya) pada kelas sharedInstance kami, kami mencapai ini dengan menggunakan+(instancetype)sharedInstance
, yang terikat hanya dimulai sekali , terlepas dari beberapa upaya dari berbagai utas. pada saat yang sama dan ingat nilainya.Beberapa sistem Singletons yang paling umum yang datang dengan Cocoa sendiri adalah:
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSFileManager defaultManager]
[NSBundle mainBundle]
[NSOperations mainQueue]
[NSNotificationCenter defaultCenter]
Pada dasarnya segala sesuatu yang perlu memiliki efek terpusat akan perlu mengikuti semacam pola desain Singleton.
sumber
Atau, Objective-C menyediakan metode inisialisasi + (void) untuk NSObject dan semua sub-kelasnya. Itu selalu dipanggil sebelum metode kelas apa pun.
Saya menetapkan breakpoint dalam sekali di iOS 6 dan dispatch_once muncul di stack frames.
sumber
Singleton Class: Tidak ada yang bisa membuat lebih dari satu objek kelas dalam hal apa pun atau melalui cara apa pun.
sumber
Ada dua masalah dengan jawaban yang diterima, yang mungkin atau mungkin tidak relevan untuk tujuan Anda.
Kode berikut menangani kedua masalah ini:
sumber
Semoga kode di atas akan membantu.
sumber
jika Anda perlu membuat singleton dengan cepat,
atau
Anda bisa menggunakan cara ini
sumber