ARC

9

altında Objective-C ilişkili nesneler sızdırıyor ARC altında garip bir objc_setAssociatedObject davranışıyla karşılaştım. Aşağıdaki kodu düşünün:ARC

static char ASSOC_KEY; 

@interface DeallocTester : NSObject 
@end 

@implementation DeallocTester 
- (void) dealloc 
{ 
    NSLog(@"DeallocTester deallocated"); 
    //objc_setAssociatedObject(self, &ASSOC_KEY, nil, OBJC_ASSOCIATION_RETAIN); 
} 
@end 

@implementation AppDelegate 
- (void) applicationDidFinishLaunching:(UIApplication *)application 
{ 
    NSObject *test = [[DeallocTester alloc] init]; 
    objc_setAssociatedObject(test, &ASSOC_KEY, [[DeallocTester alloc] init], 
          OBJC_ASSOCIATION_RETAIN); 
} 

Ben DeallocTester bir örneğini oluşturarak ediyorum, o zaman ben o zaman ikisi de kapsam dışına çıkar, bunun için ilişkili bir nesne olarak başka DeallocTester ayarlayın.

İlk nesnenin -dealloc çağrılmasını beklediğimde, ilişkili nesnenin de ayrılmasını bekliyorum, ancak yalnızca bir kez basılan "DeallocTester deallocated" mesajını görüyorum. -dealloc numaralı telefondan objc_setAssociatedObject satırını rahatsız edersem, ikinci nesne de ayrılmış olur. Nesne-C başvurusu, nesnelerin imha edilmesiyle ilişkili nesnelerin otomatik olarak ayrıldığını belirtir. Bir derleyici/ARC/ne olursa olsun bir şey mi eksik? Eğer yepyeni projeden çalıştırırsanız

Güncelleme

Bu örnek kod aslında çalışıyor. Ama yapamadığım iki ARC etkin projem var. Biraz araştırma yapacağım ve daha iyi bir örnek vereceğim. ARC altında reklamı gibi bir rdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project

+0

iOS düzeltilmesi görünüyor ? Bunun yerine sınıfta iVars ve mülkler oluşturabilirsiniz. – Abizern

+0

@Abizern ivar'ı "NSObject" e ekleyeceğim, AFAIR ivars yalnızca bir sınıf uzantısı kategorisine eklenebilir, isteğe göre değil. – iHunter

+0

@Abizern Gerçekten mi? Bir kategoride nasıl bir ivar yaratırsınız? – jlehr

cevap

9

Bir sorun buldum - bu hatanın göründüğü her iki projemde de NSZombie nesnesi etkin.

Anladığım kadarıyla, zombi nesneleri etkinleştirildiğinde, normal örnekler ayrıldıktan sonra NSZombie ile değiştirilir, ancak ilişkili tüm nesneler canlı kalır! Bu davranışa dikkat!

Ben rdar://10636309

Güncelleme oluşturduk: Orada Cédric Luthi tarafından workaround var ve bu sorun ilişkili nesneleri sen LLVM3 kullandığınız + neden kullanıyorsanız 6.

+0

Heh, "NSZombie" yi varsayılan olarak etkin bırakmamak için bir başka iyi neden. – jlehr

+0

@jlehr Ve diğer nedenleri nelerdir? Onları projelerimde her zaman etkinleştiririm ve şimdiye kadar herhangi bir sakınca görmedim. Bir şey mi eksik? Teşekkür ederim. – iHunter

+1

Zombilere açık bırakmak çeşitli problemleri maskeleyebilir ve elbette uygulamanızın tonlarca belleği sızdırmasına neden olur. – jlehr

1

kodu doldurduktan 2

Güncelleme tam olarak çalışmalarını yayınlanmıştır. Bazı şeyleri daha açık hale getirmek için dealloc uygulamanızı yeniden yazdım.

2012-01-03 06:49:39.754 ARC Stuff[47819:10103] deallocating <DeallocTester: 0x6878800> 
2012-01-03 06:49:39.756 ARC Stuff[47819:10103] deallocating <DeallocTester: 0x688b630> 

etkin size ARC ile derleme emin misin: Burada

- (void)dealloc 
{ 
    NSLog(@"deallocating %@", self); 
} 

sonuç günlük var?

+0

Vay! Hangi OS/XCode sürümünü kullanıyorsunuz? – iHunter

+0

Bunu 10.7.2'deki Xcode 4.2'de çalıştırdım. – jlehr

+0

Bende. Şimdi yeni projede tekrar kontrol edeceğim. – iHunter