Jawaban:
Seperti sebagian besar jawaban lain katakan, metode instance menggunakan instance kelas, sedangkan metode kelas dapat digunakan hanya dengan nama kelas. Dalam Objective-C mereka didefinisikan demikian:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Mereka kemudian dapat digunakan seperti ini:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Beberapa contoh dunia nyata dari metode kelas adalah metode kenyamanan pada banyak kelas Foundation seperti NSString
's +stringWithFormat:
atau NSArray
' s +arrayWithArray:
. Metode contoh akan NSArray
's -count
metode.
Semua detail teknis telah tercakup dengan baik dalam jawaban lainnya. Saya hanya ingin berbagi analogi sederhana yang menurut saya dengan baik menggambarkan perbedaan antara kelas dan contoh:
Sebuah kelas adalah seperti cetak biru dari sebuah rumah: Anda hanya memiliki satu cetak biru dan (biasanya) Anda tidak bisa melakukan itu banyak dengan cetak biru saja.
Sebuah contoh (atau objek ) adalah sebenarnya rumah yang dibangun berdasarkan cetak biru: Anda dapat membangun banyak rumah-rumah dari cetak biru yang sama. Anda kemudian dapat mengecat dinding dengan warna yang berbeda di masing-masing rumah, sama seperti Anda dapat secara independen mengubah properti setiap instance kelas tanpa mempengaruhi instance lainnya.
difference between class method and an instance method
;
Seperti jawaban lain yang telah dikatakan, metode instance beroperasi pada objek dan memiliki akses ke variabel instansinya, sementara metode kelas beroperasi pada suatu kelas secara keseluruhan dan tidak memiliki akses ke variabel instance tertentu (kecuali jika Anda melewatkan instance sebagai parameter).
Contoh yang baik dari metode kelas adalah metode tipe-kontra, yang mengembalikan jumlah total instance dari kelas. Metode kelas dimulai dengan a +
, sedangkan yang contoh dimulai dengan a -
. Sebagai contoh:
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end
main.m:
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
Output: Umur: 0 Jumlah orang: 2
Contoh lain adalah jika Anda memiliki metode yang Anda ingin agar pengguna dapat menelepon, kadang-kadang ada baiknya membuat metode kelas. Misalnya, jika Anda memiliki kelas bernama MathFunctions, Anda bisa melakukan ini:
+ (int)square:(int)num{
return num * num;
}
Jadi, pengguna akan menelepon:
[MathFunctions square:34];
tanpa harus instantiate kelas!
Anda juga dapat menggunakan fungsi kelas untuk mengembalikan objek autoreleased, seperti NSArray
+ (NSArray *)arrayWithObject:(id)object
Itu mengambil objek, meletakkannya dalam array, dan mengembalikan versi array autoreleased yang tidak harus dikelola memori, bagus untuk array temperership dan yang tidak.
Saya harap Anda sekarang mengerti kapan dan / atau mengapa Anda harus menggunakan metode kelas !!
Metode instance berlaku untuk turunan kelas (yaitu objek) sedangkan metode kelas berlaku untuk kelas itu sendiri.
Dalam C # metode kelas ditandai statis. Metode dan properti yang tidak ditandai statis adalah metode instan.
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
Jawaban untuk pertanyaan Anda tidak spesifik untuk objektif-c, namun dalam berbagai bahasa, metode Kelas dapat disebut metode statis.
Perbedaan antara metode kelas dan metode instance adalah
Metode kelas
Metode instance
Saya pikir cara terbaik untuk memahami ini adalah dengan melihat alloc
dan init
. Penjelasan inilah yang memungkinkan saya untuk memahami perbedaan.
Metode Kelas
Metode kelas diterapkan ke kelas secara keseluruhan. Jika Anda memeriksa alloc
metode, itu adalah metode kelas yang dilambangkan dengan +
sebelum deklarasi metode. Ini adalah metode kelas karena diterapkan ke kelas untuk membuat contoh spesifik dari kelas itu.
Metode Instance
Anda menggunakan metode instance untuk memodifikasi instance spesifik dari kelas yang unik untuk instance itu, bukan ke kelas secara keseluruhan. init
misalnya (dilambangkan dengan -
sebelum deklarasi metode), adalah metode instance karena Anda biasanya memodifikasi properti dari kelas itu setelah dibuat alloc
.
Contoh
NSString *myString = [NSString alloc];
Anda memanggil metode kelas alloc
untuk menghasilkan turunan dari kelas itu. Perhatikan bagaimana penerima pesan adalah kelas.
[myString initWithFormat:@"Hope this answer helps someone"];
Anda memodifikasi instance NSString
dipanggil myString
dengan menetapkan beberapa properti pada instance itu. Perhatikan bagaimana penerima pesan adalah instance (objek kelas NSString
).
alloc
mengalokasikan memori yang cukup untuk objek, init
akan mengubah apa yang ada di alamat memori tersebut untuk menentukan keadaan objek. Kami tidak dapat memodifikasi objek kecuali ada ruang untuk memodifikasinya, jadi kami menggunakan alloc
kelas yang akan memutuskan memberi kami ruang itu.
Metode kelas biasanya digunakan untuk membuat instance dari kelas itu
Misalnya, [NSString stringWithFormat:@"SomeParameter"];
mengembalikan sebuah NSString
instance dengan parameter yang dikirim kepadanya. Oleh karena itu, karena ini adalah metode Kelas yang mengembalikan objek dari tipenya, itu juga disebut metode kenyamanan.
Jadi jika saya memahaminya dengan benar.
Sebuah class
metode tidak perlu Anda untuk mengalokasikan contoh yang objek untuk penggunaan / memprosesnya. Suatu class
metode mandiri dan dapat beroperasi tanpa ketergantungan dari keadaan objek apa pun dari kelas itu. Suatu class
metode diharapkan mengalokasikan memori untuk semua pekerjaannya sendiri dan membatalkan alokasi ketika selesai, karena tidak ada instance dari kelas yang akan dapat membebaskan memori yang dialokasikan dalam panggilan sebelumnya ke metode kelas.
Suatu instance
metode justru sebaliknya. Anda tidak dapat memanggilnya kecuali Anda mengalokasikan instance kelas itu. Seperti kelas normal yang memiliki konstruktor dan dapat memiliki destruktor (yang membersihkan semua memori yang dialokasikan).
Dalam kebanyakan kemungkinan (kecuali jika Anda menulis pustaka yang dapat digunakan kembali, Anda seharusnya tidak memerlukan class
variabel.
Ambil contoh gim di mana banyak mobil bertelur .. masing-masing milik kelas CCar. Ketika mobil dipakai, itu membuat panggilan ke
[CCar registerCar:self]
Jadi kelas CCar, dapat membuat daftar setiap CCar instantiated. Katakanlah pengguna menyelesaikan level, dan ingin menghapus semua mobil ... Anda bisa: 1- Pergi melalui daftar setiap CCar yang Anda buat secara manual, dan lakukan whicheverCar.remove();
atau 2- Tambahkan metode removeAllCars ke CCar, yang akan melakukan itu untuk Anda saat Anda memanggil [CCar removeAllCars]. Yaitu allCars[n].remove();
Atau misalnya, Anda mengizinkan pengguna untuk menentukan ukuran font default untuk seluruh aplikasi, yang dimuat dan disimpan saat startup. Tanpa metode kelas, Anda mungkin harus melakukan sesuatu seperti
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
Dengan metode kelas, Anda bisa lolos [FontHandler getDefaultFontSize]
.
Adapun fungsi removeVowels Anda, Anda akan menemukan bahwa bahasa seperti C # sebenarnya memiliki keduanya dengan metode tertentu seperti toLower atau toUpper.
misalnya myString.removeVowels()
dan String.removeVowels(myString)
(dalam ObjC itu akan menjadi [String removeVowels:myString]
).
Dalam hal ini instance cenderung memanggil metode kelas, sehingga keduanya tersedia. yaitu
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
pada dasarnya, myString.toLower()
panggilan [String toLower:ownValue]
Tidak ada jawaban pasti, tetapi jika Anda merasa ingin mendorong metode kelas akan meningkatkan kode Anda, coba, dan ingatlah bahwa metode kelas hanya akan membiarkan Anda menggunakan metode / variabel kelas lainnya.
metode kelas
adalah metode yang dideklarasikan sebagai statis. Metode ini dapat dipanggil tanpa membuat instance kelas. Metode kelas hanya dapat beroperasi pada anggota kelas dan bukan pada anggota contoh karena metode kelas tidak mengetahui anggota contoh. Metode instance kelas juga tidak bisa dipanggil dari dalam metode kelas kecuali mereka dipanggil pada instance kelas itu.
Metode instance
di sisi lain memerlukan instance kelas untuk ada sebelum mereka dapat dipanggil, jadi instance kelas perlu dibuat dengan menggunakan kata kunci baru. Metode instance beroperasi pada instance kelas tertentu. Metode instance tidak dinyatakan sebagai statis.
Di Objective-C semua metode dimulai dengan karakter "-" atau "+". Contoh:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
Karakter "+" dan "-" menentukan apakah suatu metode adalah a class method
atau instance method
masing - masing.
Perbedaannya akan jelas jika kita memanggil metode ini. Di sini metode dinyatakan dalam MyClass
.
instance method
membutuhkan turunan dari kelas:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
Di dalam MyClass
metode lain dapat memanggil metode instan MyClass
menggunakan self
:
-(void) someMethod
{
[self instanceMethod];
}
Tapi, class methods
harus dipanggil di kelas itu sendiri:
[MyClass classMethod];
Atau:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
Ini tidak akan berfungsi:
// Error
[myClass classMethod];
// Error
[self classMethod];
Metode kelas biasanya membuat instance baru dari kelas atau mengambil beberapa properti global kelas. Metode kelas tidak beroperasi pada instance atau memiliki akses ke variabel instance.
Metode instance beroperasi pada instance kelas tertentu. Misalnya, metode pengakses yang Anda laksanakan adalah semua metode instan. Anda menggunakannya untuk mengatur atau mendapatkan variabel instan dari objek tertentu.
Untuk memanggil metode instance, Anda mengirim pesan ke instance kelas.
Untuk memanggil metode kelas, Anda mengirim pesan ke kelas secara langsung.
Sumber: IOS - Objective-C - Metode Kelas Dan Metode Instance
Metode kelas tidak dapat mengubah atau mengetahui nilai variabel instan apa pun. Itu harus menjadi kriteria untuk mengetahui apakah metode instance dapat menjadi metode kelas.
Ingat juga, ide yang sama berlaku untuk variabel. Anda akan menemukan istilah-istilah seperti statis, anggota, instance, kelas dan sebagainya ketika berbicara tentang variabel yang sama seperti Anda untuk metode / fungsi.
Tampaknya istilah umum dalam komunitas Obj-C adalah ivar untuk variabel misalnya, tapi saya belum menjadi pria Obj-C.
Pembaruan untuk jawaban di atas, saya setuju metode instance menggunakan instance kelas, sedangkan metode kelas dapat digunakan hanya dengan nama kelas.
Tidak ada lagi perbedaan antara metode instance & metode kelas setelah penghitungan referensi otomatis muncul di Objective-C.
Untuk Contoh [NS StringWithformat:..]
metode kelas & [[NSString alloc] initwihtformat:..]
metode contoh, keduanya sama setelah ARC
Catatan: Ini hanya dalam format kode semu
Metode kelas
Hampir semua yang perlu dilakukan adalah selama waktu kompilasi . Itu tidak memerlukan input pengguna apa pun, atau perhitungannya tidak didasarkan pada instance. Segala sesuatu tentangnya didasarkan pada kelas / cetak biru —— yang unik yaitu Anda tidak memiliki banyak cetak biru untuk satu kelas. Bisakah Anda memiliki variasi berbeda selama waktu kompilasi? Tidak, oleh karena itu kelasnya unik dan jadi tidak peduli berapa kali Anda memanggil metode kelas, penunjuk yang menunjuknya akan sama.
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
Metode Instance
Sebaliknya metode instance terjadi selama runtime, karena hanya saat itulah Anda membuat instance dari sesuatu yang dapat bervariasi pada setiap instantiation.
initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.
Jika Anda berasal dari bahasa lain, metode statis sama dengan metode kelas.
Jika Anda berasal dari Swift, ketik metode sama dengan metode kelas.
Menambah jawaban di atas
Metode kelas akan bekerja di kelas, kita akan menggunakan ini untuk tujuan umum di mana seperti + stringWithFormat, ukuran kelas dan yang paling penting untuk init dll
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
Metode Instance akan bekerja pada instance kelas bukan pada kelas seperti kita memiliki dua orang dan kami ingin mengetahui keseimbangan masing-masing secara terpisah di sini kita perlu menggunakan metode instance. Karena itu tidak akan mengembalikan respons umum. misalnya suka menentukan jumlah NSSArray dll.
[johnson getAccountBalance];
[ankit getAccountBalance];