Yanıtlar:
+
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 .
@classmethod
ve @method
çok kadar. Neden bu kadar kısa ...?
(+) 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];
+ 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 .
self
sı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; }
Apple'dan bunun kesin açıklaması 'Yöntemler ve Mesajlar' bölümünde:
Kısaca:
(yöntem, sınıfın somutlaştırılmamış bir örneği olmadan çağrılabilir). Yani şöyle diyorsunuz:
[className classMethod];
Ö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";