Saya membaca bahwa NSArray memang seperti itu. Kedengarannya berat. Saya memiliki 7 buku yang sangat gemuk di meja saya tentang Objective-C, Cocoa, dan C. Tidak ada satupun dari mereka yang menyebutkan Class Cluster sama sekali, setidaknya saya tidak dapat menemukannya di Index di bagian belakang buku. Jadi apa itu?
objective-c
cocoa
cocoa-design-patterns
class-cluster
katak terbuka
sumber
sumber
Jawaban:
Dari docs Apple ... . Singkatnya, ini adalah pola desain yang digunakan dalam kerangka Foundation, yang mungkin mengapa tidak disebutkan dalam buku ObjC.
sumber
Saya tidak tahu apa yang ada di CDP yang dirujuk Steve tetapi pada dasarnya Cluster Kelas Objective-C adalah konstruksi yang mendukung penerapan pola Pabrik abstrak .
The Ide sederhana : Anda ingin memberikan Factory (Cluster) antarmuka yang, dengan deskripsi minimal, memproduksi dan kembali contoh konkret tertentu dari sebuah Object Pabrik yang memenuhi perilaku keluarga klaster dijelaskan oleh Factory (Cluster) interface.
Contoh konkret sederhana : Contoh ini memberikan pabrik Tertawa yang memproduksi kelas konkret dari jenis tertawa tertentu (misalnya, Guffaw, Giggle). Perhatikan Tertawa initWithLaughter: metode.
Dalam Laugh.h:
#define kLaughWithGuffaw 1 #define kLaughWithGiggle 2 @interface Laugh: NSObject {} - (Laugh *) initWithLaughter:(NSUInteger) laughterType; - (void) laugh; @end
Dalam Laugh.m:
@interface Guffaws:Laugh {} - (void) laugh; @end @interface Giggles:Laugh {} - (void) laugh; @end @implementation Laugh - (Laugh *) initWithLaughter:(NSUInteger) laugherType { id instanceReturn=nil; ; // Removed for ARC [self release] if ( laughterType == kLaughWithGuffaw ) instanceReturn = [[Guffaws alloc]init]; else if( laughterType == kLaughWithGiggle ) instanceReturn = [[Giggles alloc]init]; else ; // deal with this return instanceReturn; } - (void) laugh { NSLog(@"Humbug"); } @end @implementation Guffaws - (void) laugh { NSLog(@"OH HA HA HOWAH HA HA HA"); } @end @implementation Giggles - (void) laugh { NSLog(@"Tee hee"); } @end
sumber
.m-file
.init
metode, dan mengembalikan sesuatu yang lain? Apakah ada contoh kode dari Apple di mana mereka melakukan ini? (2) Selain itu, Anda mungkin membuat instance dengan kode seperti[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Perhatikan bagaimanaLaugh
dialokasikan secara tidak perlu, karena itu akan dirilis segera setelah panggilan ini. Mengapa melakukannya dengan cara ini ketika Anda dapat membuat metode kelas seperti[Laugh laughWithLaughter:kLaughWithGiggle]
yang memberi Anda semua keuntungan dari subkelas privat, sambil menghindari masalah 1 & 2 di atas?+alloc
mengembalikan kelas pabrik tunggal yang mengimplementasikan berbagai-initWith:
metode. Metode kelas pabrik-initWith:
kemudian bertanggung jawab untuk mengalokasikan dan menginisialisasi subkelas konkret berdasarkan parameter metode yang diberikan, jika perlu, atau dalam beberapa kasus mungkin tidak mengalokasikan apa pun (seperti-[NSString initWithString:]
). Anda dapat mencobanya dengan melakukan pemeriksaan pada nilai kembali dari+[NSString alloc]
,+[NSArray alloc]
, dllDari pemrograman dalam tujuan c oleh Stephen Kochan di halaman 498 dalam glosarium, cluster:
sumber
Kluster kelas menyediakan antarmuka publik tunggal ke sekelompok implementasi subkelas pribadi yang konkret. Seorang programmer objektif-c sering menggunakan cluster kelas dan jarang menyadarinya - dan inilah inti dari cluster kelas. Tugas cluster kelas adalah menyembunyikan kompleksitas detail implementasi di balik antarmuka publik.
Banyak dari kelas Foundation adalah cluster kelas, seperti NSString, NSArray, NSDictionary, dan NSNumber. Ketika Anda memanggil
[NSString stringWithFormat:]
cluster kelas memberi Anda beberapa kelas konkret yang mengimplementasikanNSString
antarmuka. Ini bisa menjadiNSConcreteString
,NSCFString
,NSFooBarString
, dll yang cluster kelas memberi Anda didasarkan pada konstruktor atau initializer Anda panggil dan argumen.Karena itu, cluster kelas adalah salah satu konsep yang paling memberdayakan dalam pemrograman Objective-C.
Jika Anda berasal dari bahasa lain, Anda mungkin akrab dengan pola Gang of Four. Cluster kelas memiliki elemen pabrik abstrak dan pola fasad.
Dokumentasi publik Apple mencakup cluster kelas (dan cara menerapkan serta memperluasnya) secara ekstensif. Sayangnya, saya telah menemukan bahwa bagi banyak pengembang iOS ini dan pola khusus Kakao lainnya adalah titik buta.
Kompetensi Inti Kakao: Gugus kelas
Panduan Dasar-dasar Kakao: Kelompok Kelas
Contoh cara mengimplementasikan cluster kelas Anda sendiri tersedia di GitHub
sumber
Gugus kelas NSArray bukanlah "kelas berat", ini adalah cara agar sejumlah implementasi kelas array digunakan tanpa kode Anda mengetahui atau peduli tentang implementasi tertentu. Di bawah tenda, ada subclass konkret NSArray yang sesuai untuk kasus penggunaan yang berbeda, seperti array yang besar, jarang, atau array yang berisi sejumlah elemen tertentu yang diketahui pada waktu kompilasi.
NSArray, NSString, dan NSNumber adalah cluster kelas yang paling sering Anda temui.
sumber
[myArray isKindOfClass:[NSMutableArray class]]
mengembalikan YA meskipun seharusnya tidak?