ARC Nedir ve Neden Bu Kadar Önemlidir?
Ancak, ARC’nin sihirli gibi görünen bu özellikleri bazen beklenmedik hatalara yol açabilir. Peki, ARC hataları genellikle neden meydana gelir?
ARC Hatalarının En Yaygın Sebepleri
ARC, nesnelerin sahiplik durumunu yönetirken bazen karmaşık olabilir. Eğer bir nesnenin sahipliliği hakkında doğru bir karar vermezseniz, ARC, bu nesneyi doğru şekilde serbest bırakamaz ve bellek sızıntısına yol açabilir. Bu, özellikle güçlü (strong) ve zayıf (weak) referanslar arasındaki farkları anlamadığınızda gerçekleşebilir.
2. Çift Retain veya Release
Eski nesnelerde retain/release kullanırken yapılan hata, ARC ile birlikte de sorun oluşturabilir. ARC, nesnenin referans sayısını otomatik olarak artırır veya azaltır. Fakat, bir nesne üzerinde manuel olarak retain veya release çağrısı yapmaya çalıştığınızda, ARC'nin doğru çalışmamasına yol açabilirsiniz. Bu da hatalara neden olabilir.
3. Kendi Kendine Döngüsel Referanslar (Retain Cycles)
En büyük sorunlardan biri, döngüsel referanslar veya retain cycle’larıdır. Eğer bir nesne, başka bir nesneyi ve o nesne de ilk nesneyi güçlü bir referansla tutuyorsa, birbirlerine sıkı sıkıya bağlı bir döngü oluştururlar. Bu döngü, ARC'nin her iki nesneyi de serbest bırakmamasına neden olur, çünkü her biri diğerini "canlı" tutmaya çalışır.
Örnek Kod: Kendi Kendine Döngüsel Referanslar (Retain Cycle)
@interface Person : NSObject
@property (nonatomic, strong) Person *friend;
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *personA = [[Person alloc] init];
Person *personB = [[Person alloc] init];
// Retain Cycle
personA.friend = personB;
personB.friend = personA;
}
return 0;
}
Yukarıdaki örnekte, personA ve personB birbirine güçlü referanslar tutuyor. Bu durumda her iki nesne de birbirini "canlı" tutmaya çalışır, ancak ARC bu durumu çözemediği için bellek sızıntısı meydana gelir.
Retain Cycle’ı Çözmek
İşte aynı örneğin çözülmüş hali:
@interface Person : NSObject
@property (nonatomic, weak) Person *friend;
@end
@implementation Person
@end
Bu çözümde, *weak* referansı kullanarak, birbirlerini güçlü referanslarla tutan nesneler arasında bir retain cycle'ı oluşmasını engelliyoruz. Böylece her iki nesne de birbirlerini doğru şekilde serbest bırakabilir.
ARC Hatalarını Önlemek İçin İpuçları
Özellikle view controller'lar ve delegate'ler gibi nesneler arasında döngüsel referanslardan kaçınmak için *weak* veya *assign* kullanmaya özen gösterin.
2. Nesnelerin Sahipliğini Anlayın
Her zaman nesnelerin kimin sahip olduğuna dikkat edin. Eğer bir nesne başka bir nesneye güçlü referans tutuyorsa, bu nesne onun sahipliğini üstlenmiş demektir.
3. Performans Testleri Yapın
Uygulamanızda bellek sızıntılarının olup olmadığını anlamak için Xcode'un *Instruments* aracını kullanarak profil çıkarın. Bu, ARC hatalarını bulmak için güçlü bir araçtır.
4. Delegate'leri Zayıf Yapın
Bir view controller’ın veya model’in, başka bir nesneye *weak* olarak referans vermesi gereklidir. Eğer güçlü referans kullanırsanız, bu bir retain cycle’a yol açabilir.