Bir yöntemin yanındaki Objective-C'de artı ve eksi işaretleri ne anlama geliyor?


180

Objective-C'de, bir yöntem tanımının yanındaki +ve -işaretlerinin ne anlama geldiğini bilmek istiyorum .

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

Yanıtlar:


226

+bir sınıf yöntemi içindir ve -bir örnek yöntemi içindir.

Örneğin

// 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".

Sınıf ve örnek yöntemleri arasındaki farkla ilgili başka bir soru daha var .


63
Neredeyse "statik" karakterin beş karakteri bir şekilde onlar için çok fazla.
Anon.

23
@Anon: Yöntemler statik değil. Bunlar sınıf yöntemleridir. Bunlar geçersiz kılınabilir ve sınıf hiyerarşisinin bir parçasıdır. static,
C.'de

4
@Avon, bu senin için elma, kameralarında da bir flaş ve farelerinde sağ bir düğme bırakacaklar. =)
pokstad

13
@bbum paranın üstünde. Java'nın "statik" anahtar kelimeyi farklı bir şey ifade etmek için yeniden tahsis etmesi, çok daha eski C'nin hatası değildir. Statiğin, dinamiğin tersi olmasını beklerdim - değişmeyen bir şey. Ve elbette, Objective-C dili, Apple'ın OS X'te kabul etmesinden önce yaklaşık 15 yıl civarındaydı.
Quinn Taylor

3
Statik ve sınıf yöntemi arasındaki fark: MYBaseClass ve alt sınıfı MYSubClass'ta + foo yöntemini tanımlayın. NSArray * classes = @ [[MYBaseClass sınıfı], [MYSubClass sınıfı]]; [sınıflar makeObjectsPerformSelector: @selector (foo)]; Statik bir yöntemle çalışmaz. Yani, bir tercih edilen would'a, adı geçen @classmethodve @methodçok kadar. Neden bu kadar kısa ...?
uliwitness

45

(+) sınıf yöntemleri için ve (-) örneğin yöntemi için,

(+) Sınıf yöntemleri: -

Statik olarak bildirilen yöntemlerdir. Yöntem, sınıfın bir örneği oluşturulmadan çağrılabilir. Sınıf yöntemleri örnek üyelerinden habersiz olduğu için sınıf yöntemleri yalnızca sınıf üyeleri üzerinde çalışabilir ve örnek üyelerinde çalışmaz. Sınıfın örnek yöntemleri, söz konusu sınıfın bir örneğinde çağrılmadığı sürece, sınıf yöntemi içinden de çağrılamaz.

(-) Örnek yöntemleri: -

Öte yandan, çağrılmadan önce sınıfın bir örneğinin var olmasını gerektirir, bu nedenle yeni anahtar kelime kullanılarak bir sınıf örneğinin oluşturulması gerekir. Örnek yöntemleri, sınıfların belirli örneklerinde çalışır. Örnek yöntemleri statik olarak bildirilmez.

Nasıl oluşturulurum?

@interface CustomClass : NSObject

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

@end

Nasıl kullanılır?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+ yöntemleri sınıf yöntemleridir - yani, bir örnek özelliklerine erişimi olmayan yöntemlerdir. Örnek değişkenlerine erişim gerektirmeyen sınıf için ayırma veya yardımcı yöntemler gibi yöntemler için kullanılır

- yöntemler örnek yöntemleridir - bir nesnenin tek bir örneğiyle ilgilidir. Genellikle bir sınıftaki çoğu yöntem için kullanılır.

Daha fazla ayrıntı için Dil Belirtimi'ne bakın .


Aslında, sınıf yöntemlerinin örnek değişkenlere erişimi vardır, sadece selfsınıf olarak değil, sınıf olarak bir örneği vardır . Yalnızca bir örnekle ilişkilendirilmezler ve yöntem araması örnek üzerinden değil, sınıf yoluyla yapılır. Yine de yapabilirsin+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness

5

Apple'dan bunun kesin açıklaması 'Yöntemler ve Mesajlar' bölümünde:

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

Kısaca:

+ 'sınıf yöntemi' anlamına gelir

(yöntem, sınıfın somutlaştırılmamış bir örneği olmadan çağrılabilir). Yani şöyle diyorsunuz:

[className classMethod]; 


- 'örnek yöntemi' anlamına gelir

Önce bir nesneyi başlatmanız gerekir, daha sonra nesne üzerindeki yöntemi çağırabilirsiniz). Bunun gibi bir nesneyi manuel olarak başlatabilirsiniz:

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

(nesne için bu temelde ayırır bellek alanı daha sonra bu alanda nesneyi initalises -. Bir oversimplification ama bunu düşünmek için iyi bir yol Sen Alloc ve ayrı ama nesneyi init olabilir bunu asla - bu işaretçiler ilgili kötü sorunlara yol açabilir ve bellek yönetimi)

Sonra örnek yöntemini çağırın:

[myInstance instanceMethod]

Hedef C'deki bir nesnenin örneğini almanın alternatif bir yolu şöyledir:

NSNumber *myNumber = [NSNumber numberWithInt:123];

NSNumber sınıfının 'numberWithInt' sınıfı yöntemini çağıran, bu bir 'fabrika' yöntemi (yani bir nesnenin 'hazır örneği' sağlayan bir yöntem).

Amaç C ayrıca aşağıdaki gibi bir dizede olduğu gibi doğrudan özel sözdizimi kullanarak belirli nesne örneklerinin oluşturulmasına izin verir:

NSString * myStringInstance = @ "abc";

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.