2

내가 정적 분석기는이 경우에 맞을 확신하지만, 왜 아주 이해가 안 ... 여기 Xcode Analyzer는 ARC로 누수를보고합니다 - 해결 방법에 대한 조언이 필요합니까?

이 UUID 클래스 코드의 세그먼트의 :

@interface UUID { 
    CFUUIDRef uuidRef; 
} 
@end 

@implementation UUID 

- (id) initWithString:(NSString*)string { 
    if (string && [NSNull null] != (NSNull*)string) 
     return [self initWithCFUUID:CFUUIDCreateFromString(kCFAllocatorDefault, (__bridge CFStringRef) string)]; 
    else 
     return nil; 
} 

- (id) initWithCFUUID:(CFUUIDRef)uuidRef { 
    if (self = [super init]) { 
     self->uuid = uuidRef; 
    } 
    return self; 
} 
@end 

엑스 코드가있다 첫 번째 초기화에서 'return'행에 누수가 있다고보고했습니다. 스크린 샷은 here입니다.

저는 bridge, bridge_retain 및 bridge_transfer에 대한 기본 지식을 가지고 있지만이 경우 다리가 올바른 선택이라고 생각합니다.

내 이해가 정확하다면 누구나 내가 잘못했는지 여부를 조언 할 수 있습니까? 또한, 어떻게 해결할 것인가?

안부, 닉

답변

1

당신이 uuidRef에 CFRelease을 구현에 dealloc를 추가하고, 호출 할 필요가 :

- (void)dealloc 
{ 
    CFRelease(uuidRef); 
} 
+0

나는이 이해가 안 난 두려워. CFUUIDCreateFromString() 함수가 보유 개수가 +1 인 객체를 반환하면 반드시 해제하면 할당이 해제됩니다. 이 코드를 코드에 추가하면 예상대로 충돌이 발생합니다 ...? –

+1

'UUID' 클래스에서,'-initWithCFUUID :'메소드는'CFUUIDRef'를 유지해야합니다. '-dealloc'을 오버라이드하고 거기서'CFUUIDRef'를 해제해야합니다. 이는 기본 유지/해제 규칙 일뿐입니다. –

+0

@dark_perfect'UUID' 객체를 어떻게'initWithCFUUID'에 건네 주 었는지주의를 기울이지 않았습니다. 'self-> uuid = uuidRef;'행은 아마도'self-> uuidRef = uuidRef; '여야합니다. 인터페이스의 선언이 정확하다고 가정하면 ('uuid' 멤버는 없습니다). 나는 내 대답을 작동해야만하는 것으로 바꿨다. – dasblinkenlight

관련 문제