0

ARC와 관련하여 내가 이해할 수없는 한 가지 점이 있습니다 : [... copy]을 사용하여 생성 된 지역 변수를 어떻게 처리해야합니까? 플래그로 속성을 만들면 ARC가 자동으로 처리하지만, 알고있는 한 변수에 대해서는 __copy 플래그가 없습니다.ARC를 사용하여 ObjC에서 [obj copy]를 호출 할 수 있습니까?

@interface Foo : NSString 
@end 

@implementation Foo 

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

- (NSUInteger) length { 
    return 1; 
} 

- (unichar) characterAtIndex: (NSUInteger) i { 
    return 'x'; 
} 

@end 

- (void) foo { 
    Foo *f = [[Foo alloc] init]; 
    NSLog(@"%p", f); 

    Foo *f2 = [f copy]; 
    NSLog(@"%p", f2); 
} 

내가 얻을 것은 :

나는 그런 코드로이 테스트 한을

0x102406530 
0x102015f10 
0x102406530 deallocated 

나는 복사 된 변수가하지 않는 제안하는 "0x102015f10 할당 취소"결코 풀어 놓았다. autoreleased 객체를 리턴 한 또 다른 메소드 [Foo foo]을 만들었 기 때문에, 나중에 "할당 해제 된"메시지를 얻었 기 때문에 자동 릴리즈되지 않습니다.

그래서 속성으로 변환하지 않고 출시 할 수있는 방법이 있습니까?

+4

이 실험을 수행하려는 경우 메모리 관리를 완전히 이해하는 수업을 사용하는 것이 좋습니다. 'NSString'은 누가 어떤 메모리 최적화를하는지 알기 때문에 당신에게 좋은 기반을 제공하지 못합니다. 또한 NSString은 클래스 클러스터의 일부이며, 상속은 당신이했던 것처럼 간단하지 않습니다. 당신이 뛰어 넘을 필요가있는 더 많은 농구가 있습니다. –

+0

@ Paul.s 그럼 영국인 맞지? 나는 네가 존재했다는 것을 몰랐다. 이 구조는 무엇입니까? –

답변

1

좋아, 내 나쁜 ARC 실제로 복사 된 개체를 제대로 처리합니다. 테스트를 위해 NSString을 사용하기 때문에 잘못된 결과가 나타납니다. 명시 적으로 구현하는 대신 이미 복사를 구현 한 클래스를 사용하고 싶었 기 때문입니다. NSObject를 상속받은 클래스에서 테스트를 반복하고 [[Foo alloc] init]을 반환하여 copyWithZone:을 구현하면 두 개의 "할당 취소 된"메시지가 나타납니다. 그 점을 지적 해 주신 Paul.s에게 감사드립니다.

+0

ARC에서'copy'는 참조 카운트가 1 인 객체를 반환합니다. 그런 다음 강력한 참조에 할당하면 컴파일러가 객체가 다른 객체를 복사하여 생성되었음을 확인한 후 다시 참조가 유지되지 않습니다. –

+0

또한, 왜 이것은 다운 그레이드되는 것입니까? –

+1

실제로 ARC는 복사 된 객체를 올바르게 처리합니다. 그리고 당신은 NSString을 서브 클래스화할 수 있지만, 문서에는 당신이 오버라이드 (override)해야하는 메소드가있다. 다른 것들 중에서도, 'NSCopying'의 구현 – Abizern

관련 문제