Bazı durumlarda, tanımlanan veri tipinin (genel veri tipi, id) hangi türde veri taşıyacağı önceden belli değildir ve gerekli kontroller derleme zamanında değil program çalıştırıldığında yapılır. Bu işlem dinamik tip belirleme ya da dinamik bağlama adını alır. Aşağıdaki kodu inceleyiniz:
#import
@interface DikDortgen:NSObject
{
int genis;
int yuksek;
}
-(void) genAta:(int) g veYuks: (int) y;
-(int) alan;
-(int) cevre;
@end
@implementation DikDortgen
-(void) genAta:(int) g veYuks: (int) y;
{
genis=g;
yuksek=y;
}
-(int) alan
{
return genis*yuksek;
}
-(int) cevre
{
return 2*(genis+yuksek);
}
@end
@interface Daire:NSObject
{
float ycap;
}
-(void) ycapAta: (int) r;
-(float) alan;
-(float) cevre;
@end
@implementation Daire
-(void) ycapAta: (int) r
{
ycap=r;
}
-(float) alan
{
return 3.14159*ycap*ycap;
}
-(float) cevre
{
return 2*3.14159*ycap;
}
@end
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
DikDortgen *d = [[DikDortgen alloc] init];
Daire *dr=[[Daire alloc] init];
[d genAta:3 veYuks: 10];
[dr ycapAta: 7];
NSLog(@"Dikdörtgen Alanı=%d",[d alan]);
NSLog(@"Dikdörtgen Çevresi=%i",[d cevre]);
NSLog(@"Dairenin Alanı=%f",[dr alan]);
NSLog(@"Dairenin Çevresi=%f",[dr cevre]);
[d release];
[dr release];
[pool drain];
return 0;
}
Programın çıktısı şu şekilde olacak:
Dikdörtgen Alanı=30
Dikdörtgen Çevresi=26
Dairenin Alanı=153.937912
Dairenin Çevresi=43.982262
ID Veri Tipi
Objelerin hafızadaki yerini takip etmek için pointer kullanılması gerekmektedir. Objective- C'nin dinamik yapısı sebebiyle objenin class bilgilerine girmeden id tanımlamasıyla tüm objeleri kapsayan tanımlamalar yapabilirsiniz.
id someObject = @"Hello, World!";
[someObject removeAllObjects];
Aynı işlemi id şeklinde tanımlamak yerine NSString type'ında tanımlama yapılabilirdi. Bu tanımlamayla birlikte removeAllObjects metodu çalıştırılamayacaktı. Çünkü NSString böyle bir metoda sahip değil. id veri tipi tüm metodlara sahip olduğu için kullanım kolaylığı sağlıyor.
Bu kodun sorunsuz çalışması için Build Setting kısmından Automatic Referance Counting değerini No şeklinde çevirmelisiniz.