Apa arti tanda plus dan minus di Objective-C di sebelah metode?

180

Di Objective-C, saya ingin tahu apa +dan -tanda di samping definisi metode.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
gyurisc
sumber

Jawaban:

226

+adalah untuk metode kelas dan -untuk metode contoh.

Misalnya

// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end

// somewhere else:

id myArray = [NSArray array];         // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4];   // here the message is sent to myArray

// Btw, in production code one uses "NSArray *myArray" instead of only "id".

Ada pertanyaan lain yang berurusan dengan perbedaan antara metode kelas dan contoh .

Georg Schölly
sumber
63
Ini hampir seolah-olah lima karakter tambahan "statis" entah bagaimana terlalu banyak untuk mereka.
Anon.
23
@ Anon: Metodenya tidak statis. Mereka adalah metode kelas. Mereka dapat ditimpa dan sangat menjadi bagian dari hirarki kelas. statis menyiratkan sesuatu yang sangat berbeda dalam C.
bbum
4
@ Avon, itu apel untuk Anda, mereka akan meninggalkan flash pada kamera mereka juga, dan tombol kanan pada tikus mereka. =)
pokstad
13
@bbum ada di uang. Fakta bahwa Java menggunakan kembali kata kunci "statis" untuk mengartikan sesuatu yang berbeda bukanlah kesalahan dari C. yang jauh lebih tua. Walaupun penggunaannya mungkin tidak sepenuhnya intuitif di C, tampaknya bahkan lebih tidak seperti di Jawa. Saya berharap statis menjadi kebalikan dari dinamis - sesuatu yang tidak berubah. Dan tentu saja, bahasa Objective-C sudah ada selama hampir 15 tahun sebelum Apple mengadopsinya di OS X.
Quinn Taylor
3
Perbedaan antara metode statis dan kelas: Tentukan metode + foo di MYBaseClass dan subkelasnya MYSubClass. NSArray * classes = @ [[MYBaseClass class], [MYSubClass class]]; [kelas makeObjectsPerformSelector: @selector (foo)]; Tidak akan bekerja dengan metode statis. Yang mengatakan, saya lebih suka @classmethoddan @methodatau lebih, juga. Kenapa begitu singkat ...?
uliwitness
45

(+) untuk metode kelas dan (-) misalnya metode,

(+) Metode kelas: -

Apakah metode yang dinyatakan 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.

Bagaimana cara membuatnya?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

Cara Penggunaan?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
Vandit Mehta
sumber
18

+ metode adalah metode kelas - yaitu, metode yang tidak memiliki akses ke properti instance. Digunakan untuk metode seperti mengalokasikan atau metode pembantu untuk kelas yang tidak memerlukan akses ke variabel instan

- Metode adalah metode instance - berhubungan dengan satu instance objek. Biasanya digunakan untuk sebagian besar metode di kelas.

Lihat Spesifikasi Bahasa untuk lebih detail.

Robert Christie
sumber
Yah, sebenarnya metode kelas memang memiliki akses ke variabel instan, mereka hanya tidak memiliki instance self, melainkan kelas. Mereka tidak terkait dengan sebuah instance, dan metode pencarian tidak melalui instance, tetapi melalui kelas. Namun, Anda bisa melakukannya+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness
5

Penjelasan definitif ini dari Apple ada di sini, di bawah bagian 'Metode dan Perpesanan':

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

Secara singkat:

+ berarti 'metode kelas'

(metode dapat dipanggil tanpa turunan dari kelas yang sedang dipakai). Jadi Anda menyebutnya seperti ini:

[className classMethod]; 


- berarti 'metode instan'

Anda harus membuat instance objek terlebih dahulu, lalu Anda dapat memanggil metode pada objek). Anda dapat secara manual instantiate objek seperti ini:

SomeClass* myInstance = [[SomeClass alloc] init];

(ini pada dasarnya mengalokasikan ruang memori untuk objek kemudian menginisialisasi objek di ruang itu - penyederhanaan yang berlebihan tetapi cara yang baik untuk memikirkannya. Anda dapat mengalokasikan dan init objek secara terpisah tetapi tidak pernah melakukan ini - ini dapat menyebabkan masalah buruk terkait dengan pointer dan manajemen memori)

Kemudian panggil metode instance:

[myInstance instanceMethod]

Cara alternatif untuk mendapatkan instance objek di Objective C adalah seperti ini:

NSNumber *myNumber = [NSNumber numberWithInt:123];

yang memanggil metode kelas 'numberWithInt' dari kelas NSNumber, yang merupakan metode 'pabrik' (yaitu metode yang memberi Anda 'contoh dibuat siap' dari suatu objek).

Objective C juga memungkinkan pembuatan instance objek tertentu secara langsung menggunakan sintaks khusus, seperti dalam kasus string seperti ini:

NSString * myStringInstance = @ "abc";

Chris Halcrow
sumber