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
iOS düzeltilmesi görünüyor ? Bunun yerine sınıfta iVars ve mülkler oluşturabilirsiniz. – Abizern
@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
@Abizern Gerçekten mi? Bir kategoride nasıl bir ivar yaratırsınız? – jlehr