Objective-C Uzantıları

Bir sınıf uzantısı, bir kategoriye bir miktar benzerlik taşır, ancak yalnızca derleme zamanında kaynak koduna sahip olduğunuz bir sınıfa eklenebilir (sınıf, sınıf uzantısı ile aynı zamanda derlenir).

Bir sınıf uzantısı tarafından bildirilen yöntemler, orijinal sınıf için uygulama bloğunda uygulanır, bu nedenle, örneğin, NSString gibi bir Cocoa veya Cocoa Touch sınıfı gibi bir çerçeve sınıfında bir sınıf uzantısı bildiremezsiniz.

Uzantılar aslında kategori adı olmayan kategorilerdir. Genellikle şöyle anılıranonymous categories.

Bir uzantıyı bildirmek için sözdizimi, standart bir Objective-C sınıfı açıklaması gibi @interface anahtar sözcüğünü kullanır, ancak bir alt sınıftan herhangi bir kalıtımı göstermez. Bunun yerine, aşağıda gösterildiği gibi sadece parantez ekler -

@interface ClassName ()

@end

Uzantıların Özellikleri

  • Herhangi bir sınıf için bir uzantı bildirilemez, yalnızca kaynak kodun orijinal uygulamasına sahip olduğumuz sınıflar için.

  • Bir uzantı, yalnızca sınıfa özgü özel yöntemler ve özel değişkenler eklemektir.

  • Uzantıların içinde bildirilen herhangi bir yöntem veya değişken, devralınan sınıflar için bile erişilebilir değildir.

Uzantı Örneği

Uzantısı olan bir SampleClass sınıfı oluşturalım. Uzantıda, özel bir değişken dahili kimliğimiz olsun.

Ardından, internalID'yi işledikten sonra externalID'yi döndüren getExternalID yöntemine sahip olalım.

Örnek aşağıda gösterilmiştir ve bu çevrimiçi derleyicide çalışmayacaktır.

#import <Foundation/Foundation.h>

@interface SampleClass : NSObject {
   NSString *name;
}

- (void)setInternalID;
- (NSString *)getExternalID;

@end

@interface SampleClass() {
   NSString *internalID;
}

@end

@implementation SampleClass

- (void)setInternalID {
   internalID = [NSString stringWithFormat: 
   @"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}

- (NSString *)getExternalID {
   return [internalID stringByReplacingOccurrencesOfString: 
   @"UNIQUEINTERNALKEY" withString:@""];
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass setInternalID];
   NSLog(@"ExternalID: %@",[sampleClass getExternalID]);        
   [pool drain];
   return 0;
}

Şimdi programı derleyip çalıştırdığımızda aşağıdaki sonucu alacağız.

2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51

Yukarıdaki örnekte, internalID'nin doğrudan döndürülmediğini görebiliriz. Burada UNIQUEINTERNALKEY'i kaldırıyoruz ve yalnızca kalan değeri getExternalID yöntemi için kullanılabilir hale getiriyoruz.

Yukarıdaki örnek yalnızca bir dize işlemi kullanır, ancak şifreleme / şifre çözme gibi birçok özelliğe sahip olabilir.