Yanıtlar:
Diğer yanıtların çoğunun söylediği gibi, örnek yöntemleri sınıfın bir örneğini kullanırken, sınıf yöntemi yalnızca sınıf adıyla kullanılabilir. Amaç-C'de bu şekilde tanımlanırlar:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Daha sonra şu şekilde kullanılabilirler:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Sınıf yöntemlerinden bazı gerçek dünya örnekleri NSString
's ' +stringWithFormat:
veya NSArray
's' gibi birçok Foundation sınıfındaki kolaylık yöntemleridir +arrayWithArray:
. Örnek, yöntem olacaktır NSArray
bireyin -count
yöntemi.
Tüm teknik detaylar diğer cevaplarda iyi bir şekilde ele alınmıştır. Ben sadece bir sınıf ve bir örnek arasındaki farkı güzelce gösteren basit bir benzetmeyi paylaşmak istiyorum:
Bir sınıf gibidir planı bir evin: Yalnızca bir plan var ve (genellikle) tek başına planı ile bu kadar yapamaz.
Bir örnek (veya nesne ), plana dayanarak inşa ettiğiniz gerçek evdir : Aynı plandan çok sayıda ev inşa edebilirsiniz. Daha sonra, diğer sınıfları etkilemeden bir sınıfın her örneğinin özelliklerini bağımsız olarak değiştirebileceğiniz gibi, duvarların her birinde farklı bir renk boyayabilirsiniz.
difference between class method and an instance method
;
Diğer yanıtların söylediği gibi, örnek yöntemleri bir nesne üzerinde çalışır ve örnek değişkenlerine erişirken, bir sınıf yöntemi bir sınıfta bir bütün olarak çalışır ve belirli bir örneğin değişkenlerine erişemez ((örneği bir parametre).
Sınıf yöntemine iyi bir örnek, bir sınıfın toplam örnek sayısını döndüren sayaç tipi bir yöntemdir. Sınıf yöntemleri a ile başlar +
, örnek olanlar ise bir ile başlar -
. Örneğin:
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]);
Çıktı: Yaş: 0 Kişi sayısı: 2
Başka bir örnek, kullanıcının arayabilmesini istediğiniz bir yönteminiz varsa, bazen bunu bir sınıf yöntemi yapmak iyi olur. Örneğin, MathFunctions adında bir sınıfınız varsa, bunu yapabilirsiniz:
+ (int)square:(int)num{
return num * num;
}
Böylece kullanıcı şunu arar:
[MathFunctions square:34];
hiç bir zaman dersi başlatmak zorunda kalmadan!
NSArray'ınki gibi otomatik olarak yayınlanan nesneleri döndürmek için sınıf işlevlerini de kullanabilirsiniz
+ (NSArray *)arrayWithObject:(id)object
Bu, bir nesneyi alır, bir diziye yerleştirir ve dizinin bellek tarafından yönetilmesi gerekmeyen, geçici diziler için harika olan ve olmayan bir otomatik olarak yayınlanmış sürümünü döndürür.
Umarım şimdi sınıf yöntemlerini ne zaman ve / veya neden kullanmanız gerektiğini anlarsınız !!
Bir örnek yöntemi sınıfın bir örneğine (yani bir nesneye) uygulanırken sınıf yöntemi sınıfın kendisine uygulanır.
C # 'da bir sınıf yöntemi statik olarak işaretlenmiştir. Statik olarak işaretlenmemiş yöntemler ve özellikler, örnek yöntemlerdir.
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
Sorunuzun cevabı objektif-c'ye özgü değildir, ancak farklı dillerde Sınıf yöntemleri statik yöntemler olarak adlandırılabilir.
Sınıf yöntemleri ve örnek yöntemler arasındaki fark
Sınıf yöntemleri
Örnek yöntemleri
Bence bunu anlamanın en iyi yolu alloc
ve init
. Farklılıkları anlamama izin veren bu açıklama oldu.
Sınıf Yöntemi
Sınıf yöntemi bir bütün olarak sınıfa uygulanır. alloc
Yöntemi kontrol ederseniz , bu yöntem +
yöntem bildiriminden önce belirtilen bir sınıf yöntemidir . Bu bir sınıf yöntemidir, çünkü o sınıfın belirli bir örneğini yapmak için sınıfa uygulanır.
Örnek Yöntemi
Bir sınıfın bir bütün olarak değil, o örneğe özgü olan belirli bir sınıf örneğini değiştirmek için bir instance yöntemi kullanırsınız. init
örneğin ( -
yöntem bildiriminden önce bir ile belirtilir ), bir örnek yöntemdir, çünkü normalde sınıfın oluşturulduktan sonra özelliklerini değiştirirsiniz alloc
.
Misal
NSString *myString = [NSString alloc];
Bu sınıfın alloc
bir örneğini oluşturmak için class yöntemini çağırıyorsunuz . Mesajın alıcısının nasıl bir sınıf olduğuna dikkat edin.
[myString initWithFormat:@"Hope this answer helps someone"];
Sen örneğini değiştiriyorsanız NSString
denilen myString
o örneğe bazı özelliklerini ayarlayarak. İletinin alıcısının bir örnek (sınıf nesnesi NSString
) olduğuna dikkat edin .
alloc
nesne için yeterli bellek ayırır, nesnenin init
durumunu tanımlamak için bu bellek adreslerindeki bilgileri değiştirir. İçinde değiştirilecek bir alan olmadığı sürece bir nesneyi değiştiremeyiz, bu yüzden alloc
sınıfta bize bu alanı vermeye karar vereceğiz.
Sınıf yöntemleri genellikle bu sınıfın örneklerini oluşturmak için kullanılır
Örneğin, kendisine gönderilen parametreye sahip [NSString stringWithFormat:@"SomeParameter"];
bir NSString
örnek döndürür . Bu nedenle, kendi türündeki bir nesneyi döndüren bir Class yöntemi olduğundan, buna kolaylık yöntemi de denir.
Eğer doğru anlarsam.
Bir class
yöntem, onu kullanmak / işlemek için o nesnenin örneğini tahsis etmenizi gerektirmez. Bir class
yöntem bağımsızdır ve o sınıfın herhangi bir nesnesinin durumuna bağımlı olmadan çalışabilir. Bir class
yöntemin kendi çalışması için bellek ayırması ve bittiğinde dağıtması beklenir, çünkü bu sınıfın hiçbir örneği sınıf yöntemine yapılan önceki çağrılarda ayrılan belleği serbest bırakamaz.
Bir instance
yöntem tam tersidir. Söz konusu sınıfın bir örneğini ayırmadığınız sürece arayamazsınız. Bu, bir yapıcıya sahip olan ve bir yıkıcıya sahip olabilen (tahsis edilen tüm belleği temizleyen) normal bir sınıf gibidir.
Çoğu olasılıkta (yeniden kullanılabilir bir kitaplık yazmıyorsanız, bir class
değişkene ihtiyacınız olmamalıdır .
Örneğin, çok sayıda arabanın üretildiği bir oyunu ele alalım .. her biri CCar sınıfına aittir. Bir araba başlatıldığında,
[CCar registerCar:self]
Böylece CCar sınıfı, somutlaştırılan her CCar'ın bir listesini yapabilir. Kullanıcının bir düzeyi bitirdiğini ve tüm arabaları kaldırmak istediğini varsayalım ... Şunları yapabilirsiniz: 1- Manuel olarak oluşturduğunuz her CCar'ın bir listesini gözden geçirin ve yapın whicheverCar.remove();
veya 2- CCar'a bunu yapacak bir removeAllCars yöntemi ekleyin [CCar removeAllCars] dediğinizde sizin için. yani allCars[n].remove();
Örneğin, kullanıcının başlangıçta yüklenen ve kaydedilen tüm uygulama için varsayılan bir yazı tipi boyutu belirlemesine izin verirsiniz. Sınıf yöntemi olmadan, şöyle bir şey yapmanız gerekebilir
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
Sınıf yöntemi ile, kurtulabilirsiniz [FontHandler getDefaultFontSize]
.
RemoveVowels işlevinize gelince, C # gibi dillerin aslında her ikisinde de toLower veya toUpper gibi bazı yöntemlere sahip olduğunu göreceksiniz.
örneğin myString.removeVowels()
ve String.removeVowels(myString)
(ObjC'de [String removeVowels:myString]
).
Bu durumda örnek muhtemelen sınıf yöntemini çağırır, bu nedenle her ikisi de kullanılabilir. yani
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
temel olarak, myString.toLower()
aramalar [String toLower:ownValue]
Kesin bir cevap yoktur, ancak bir sınıf yöntemini itmek istiyorsanız kodunuzu geliştirir, bir şans verir ve bir sınıf yönteminin yalnızca diğer sınıf yöntemlerini / değişkenlerini kullanmanıza izin vereceğini unutmayın.
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 yalnızca sınıf üyeleri üzerinde çalışabilir, sınıf üyeleri örnek üyelerinden habersiz olduğu için sınıf üyeleri üzerinde çalışamaz. 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önteminden 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 sözcük 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.
Objective-C'de tüm yöntemler "-" veya "+" karakteriyle başlar. Misal:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
"+" Ve "-" karakterleri, bir yöntemin sırasıyla bir class method
veya bir olup olmadığını belirtir instance method
.
Bu yöntemleri çağırırsak fark açık olacaktır. Burada yöntemler belirtilir MyClass
.
instance method
sınıfın bir örneğini gerektirir:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
MyClass
Diğer yöntemlerin içinde örnek MyClass
kullanma yöntemlerini çağırabilir self
:
-(void) someMethod
{
[self instanceMethod];
}
Ancak, class methods
sınıfın kendisinde çağrılmalıdır:
[MyClass classMethod];
Veya:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
Bu işe yaramaz:
// Error
[myClass classMethod];
// Error
[self classMethod];
Bir sınıf yöntemi tipik olarak ya sınıfın yeni bir örneğini oluşturur ya da sınıfın bazı genel özelliklerini alır. Sınıf yöntemleri bir örnek üzerinde çalışmaz veya örnek değişkenine erişimi yoktur.
Bir örnek yöntemi, sınıfın belirli bir örneğinde çalışır. Örneğin, uyguladığınız erişimci yöntemi, tüm örnek yöntemleridir. Belirli bir nesnenin örnek değişkenlerini ayarlamak veya almak için bunları kullanırsınız.
Bir örnek yöntemini çağırmak için iletiyi sınıfın bir örneğine gönderirsiniz.
Bir sınıf yöntemini çağırmak için, mesajı doğrudan sınıfa gönderirsiniz.
Kaynak: IOS - Objective-C - Sınıf Yöntemleri ve Örnek Yöntemleri
Sınıf yöntemleri herhangi bir örnek değişkeninin değerini değiştiremez veya bilemez. Bir örnek yönteminin bir sınıf yöntemi olup olmadığını bilmek için kriterler bu olmalıdır.
Unutmayın, aynı fikir değişkenler için de geçerlidir. Yöntemler / işlevler için yaptığınız gibi değişkenlerden bahsederken statik, üye, örnek, sınıf vb. Terimlerle karşılaşacaksınız.
Görünüşe göre Obj-C topluluğunda ortak terim ivar gibi değişken, ama henüz bir Obj-C adamı değilim.
Yukarıdaki yanıtlara yapılan bir güncellemede, örnek yöntemlerinin bir sınıfın örneğini kullandığını kabul ederken, sınıf yöntemi yalnızca sınıf adıyla kullanılabilir.
Objective-C'de otomatik referans sayımı gerçekleştikten sonra bulut sunucusu yöntemi ile sınıf yöntemi arasında daha fazla fark yoktur.
Örneğin, [NS StringWithformat:..]
bir sınıf yöntemi ve [[NSString alloc] initwihtformat:..]
bir örnek yöntemi, her ikisi de ARC'den sonra aynıdır
Not: Bu yalnızca sahte kod biçimindedir
Sınıf yöntemi
Neredeyse tüm yapması gereken derleme zamanı . Herhangi bir kullanıcı girdisine veya hesaplamanın bir örneğe dayandırılmasına gerek yoktur. Onunla ilgili her şey sınıf / plana dayanır — bu benzersizdir, yani bir sınıf için birden fazla taslağınız yoktur. Derleme süresinde farklı varyasyonlarınız olabilir mi? Hayır, bu nedenle sınıf benzersizdir ve bu yüzden kaç kez bir sınıf yöntemi çağırsanız da ona işaret eden işaretçi aynı olacaktır.
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
Örnek Yöntemi
Aksine örnek yöntemi çalışma zamanında olur, çünkü ancak o zaman her örneklemede değişebilecek bir şeyin örneğini oluşturmuş olursunuz.
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.
Başka dillerden geliyorsanız Statik yöntemler sınıf yöntemleriyle aynıdır.
Swift'ten geliyorsanız, yazma yöntemleri sınıf yöntemleri ile aynıdır.
Yukarıdaki cevaplara ekleme
Sınıf yöntemi sınıfta çalışacak, bunu + stringWithFormat, sınıfın boyutu ve en önemlisi init vb.
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
Örnek Yöntemi , iki kişimiz olduğu gibi bir sınıfta olmayan bir sınıf örneği üzerinde çalışacaktır ve burada örnek yöntemini kullanmamız gereken her birinin ayrı ayrı dengesini bilmek istiyoruz. Çünkü genel yanıtı döndürmeyecek. örneğin NSSArray sayısını belirlemek gibi.
[johnson getAccountBalance];
[ankit getAccountBalance];