id
유형의 객체를 NSInvocation
객체에 전달하려고합니다. 컴파일러에서는 다음과 같은 브릿지 캐스트를 제안합니다.Objective C 객체를 브리징 할 때 메모리 누수를 막기 위해 특별한 조치를 취해야합니까?
[invocation setArgument:(__bridge void *)(argument) atIndex:idx];
괜찮습니까? 메모리 누수 또는 기타 문제를 방지하기 위해 다른 작업을해야합니까?
id
유형의 객체를 NSInvocation
객체에 전달하려고합니다. 컴파일러에서는 다음과 같은 브릿지 캐스트를 제안합니다.Objective C 객체를 브리징 할 때 메모리 누수를 막기 위해 특별한 조치를 취해야합니까?
[invocation setArgument:(__bridge void *)(argument) atIndex:idx];
괜찮습니까? 메모리 누수 또는 기타 문제를 방지하기 위해 다른 작업을해야합니까?
__bridge
은 느슨한 용어로 객체의 메모리 관리에 영향을주지 않고 Objective-C와 C 사이를왔다 갔다 할 수 있습니다.
__bridge_transfer
은 개체 소유권이 변경된 상태에서 C에서 Objective-C로 개체를 전송하기위한 것입니다. CF 유지 횟수를 줄이고 메모리 관리를 ARC로 넘겨줍니다. ARC는 필요한 방식으로 객체를 유지할만큼 똑똑해야합니다.
__bridge_retained
은 본질적으로 __bridge_transfer
의 반대이므로 Objective-C에서 C로 전달되어 프로세스에서 개체의 보유 수를 증가시킵니다. ARC는 해당 객체에 관심을 나타내지 않습니다.
NSInvocation
으로 연결된 캐스팅을 사용하지 마십시오.
NSInvocation에서 인수를 설정할 때 인수 자체가 아니라 인수에 대한 포인터를 전달한다는 점에 유의하십시오. void*
으로 전송하지 않아도됩니다. NSInvocation은 NSInvocation 개체를 만드는 데 사용 된 메서드 서명을 기반으로 해당 포인터로 수행 할 작업을 결정합니다. 예를 들어
:
- (NSInvocation*)makeAnInvocation
{
MyObject* anObject = [MyObject new];
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(doIt:)];
[inv setTarget:self];
[inv setSelector:@selector(doIt:)];
[inv setArgument:&anObject atIndex:2]; // Passing the pointer to `anObject`
[inv retainArguments];
return inv;
}
지금까지 메모리 관리에 관한 한 : 즉시 당신이 -retainArguments
를 호출하는 메소드를 호출하지 않는 경우 일반적으로 말하기. 이렇게하면 NSInvocation 개체가 메서드 서명을 기반으로 필요에 따라 해당 인수를 유지하거나 복사 할 수 있습니다. 인수는 NSInvocation 객체가 할당 해제 될 때 해제됩니다.