ARC에서 이상한 objc_setAssociatedObject
동작이 발생했습니다. 다음 코드를 고려하십시오ARC에서 누출되는 Objective-C 관련 개체
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);
}
내가 DeallocTester
의 인스턴스를 만드는거야을, 그때는 둘 다의 범위를 벗어나 이동, 그것을 위해 관련 개체로 다른 DeallocTester
을 설정합니다.
첫 번째 개체의 -dealloc
이 호출 될 예정이며, 관련된 개체도 할당 해제 될 것으로 예상되지만, "DeallocTester deallocated"
메시지는 한 번만 인쇄됩니다. objc_setAssociatedObject
라인에서 -dealloc
의 주석 처리를 제거하면 두 번째 객체의 할당이 해제됩니다.
Objective-C 참조는 연결된 개체가 개체가 제거 될 때 자동으로 할당이 해제된다는 것을 나타냅니다. 컴파일러/ARC/어떤 문제인지 또는 내가 놓친 것이 있습니까? 당신은 아주 새로운 프로젝트에서 실행하는 경우
업데이트
이 샘플 코드는 실제로 노력하고 있습니다. 하지만 ARC가 지원되지 않는 프로젝트는 두 곳 있습니다. 몇 가지 조사를하고 더 나은 샘플을 제공 할 것입니다. ARC에서 광고로 나는 rdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project
아이폰 OS에서 수정 될 것으로 보인다 ? 클래스의 카테고리에 iVars 및 속성을 대신 작성할 수 있습니다. – Abizern
@Abizern 'NSObject'에 ivars를 추가 할 예정입니다. AFAIR ivars는 클래스 확장 카테고리에만 추가 할 수 있고 임의의 클래스에는 추가 할 수 없습니다. – iHunter
@Abizern 정말요? 카테고리에서 아이어를 어떻게 만듭니 까? – jlehr