Ders 12 : ARC (Automatic Reference Counting)


Bugün Xcode'un güzelliklerinden birini anlatacağım. Xcode'un önceki sürümleri ile gelen hayati bir özellik bu. Fakat bu ders anlatacağımız en önemli ve hayati derslerden birisi. Sizeler ARC den bahsedeceğim. Açılımı Automatic Reference Counting (Otomatik referans sayma). Şimdi geriye bir dönelim.
Herhangi bir türde bir obje oluşturmayı öğrendik. Oluşturduğumuz objelerin memory içerisinde yer işgal ettiğini biliyoruz. Peki uygulamamız içerisinde bir çok yeni obje açarsak ve artık memory'de daha yer kalmayacak olursa. Örneğin bir savaş oyunu yaptığınızı düşünün. Ateş ettiğinizde bir mermi oluşturmuş olacaksınız. Binlerce defa ateş ettikten sonra memory'den hatırı sayılır bir yer alınmış olacak. Bizim mermilerle işimiz bitmiş olmasına rağmen mermiler halen momory içinde yer işgal ediyor olacak. İşte tam bu noktada ARC yardıma yetişiyor. Eğer oluşturulan bir obje ile ilgili bütün işlerimiz bitmişse yani artık bir işe yaramıyorsa ARC bu objeyi otomatik olarak siliyor. Örneğin

-(void)mermiAt{
    
    Mermi * mermi = [[Mermi alloc]init];
    mermi.damage = 5.0f;
    
    health -= mermi.damage;
}

Bu bizim mermi atma fonksiyonumuz olsun. Bu fonksiyon her çağırıldığında Mermi türünden bir obje memory'den yer alıyor. Ardından fonksiyon bitiyor. Fonksiyon bitince mermi objesini hayatta tutacak birbaşka obje veya bir neden kalmıyor. Ve ARC mermiyi siliyor. Fakat eğer fonksiyon şu şekilde olsaydı

-(void)mermiAt{
    
    Mermi * mermi = [[Mermi alloc]init];
    mermi.damage = 5.0f;
    mermi.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:mermi];
    
    health -= mermi.damage;

}

Bu durumda mermi objesi ekranın üzerine yerleştirilmiş olduğundan self.view objesinin hala mermiye ihtiyacı olmuş olacaktı. Bu yüzden ARC mermiyi silmeyecekti. Bu durumda bu ilişkiyi sonlardırmak için merminin ekrandan silinmiş olması gerekir. Yani removeFromSuperview fonksiyonunun çağırılması gerekir.

    [mermi removeFromSuperview];


Aynen bu şekilde. Aslında ARC nin yapmış olduğu işlem dealloc() fonksiyonunu çağırmaktır. Fakat bunu manuel bir biçimde yapmaya kalkışırsanız hata alırsınız








Resimde görüldüğü üzere ARC bu fonksiyonun manuel olarak çağırılmasını engeller. Bunun için bir objeyi ekrandan silinmesini gerektiğini düşündüğünüz an bu objenin başka bir obje ile bağı olup olmadığını kontrol etmeniz gerekir. Objelerin silinmemesi çok büyük sorunlara sebep olabilir. Bir objenin ölüp ölmediğini kontrol etmenin bir yolu var. Obje hangi Class tan türetilmişse Classın .m dosyasının içine dealloc() metodu açılır. Ve bu bu metoda girilip girilmediğine dair bir işaret bırakılır veya breakpoint konularak program durdurulur örneğin.

@interface Mermi : UIView;
@property float damage;
@end

@implementation Mermi

-(void)dealloc{
    
    NSLog(@"Eyvah! Ben Öldüm : %@",self.class);
}

@end

@interface ViewController ()

@end

@implementation ViewController

{
    float health;
}
- (void)viewDidLoad {
    [super viewDidLoad];

    [self mermiAt];
}
-(void)mermiAt{
    
    Mermi * mermi = [[Mermi alloc]init];
    mermi.damage = 5.0f;
    health -= mermi.damage;
}


@end

Bu kodu viewController sayfamızın içine yazıp programı çalıştırısak önce mermi at fonksiyonuna girer. İşlemleri yapar ve sonra memri ölür ve ekrana

Eyvah! Ben Öldüm : Mermi

Yazar. Bunların yanında nesnelerin birbirine weak veya strong şekilde bağlı olma durumları da vardır. Bunların neler olduğunu bir sonraki derste anlatacağım.

Hiç yorum yok :

Yorum Gönder