답변

6

__bridge은 느슨한 용어로 객체의 메모리 관리에 영향을주지 않고 Objective-C와 C 사이를왔다 갔다 할 수 있습니다.

__bridge_transfer은 개체 소유권이 변경된 상태에서 C에서 Objective-C로 개체를 전송하기위한 것입니다. CF 유지 횟수를 줄이고 메모리 관리를 ARC로 넘겨줍니다. ARC는 필요한 방식으로 객체를 유지할만큼 똑똑해야합니다.

__bridge_retained은 본질적으로 __bridge_transfer의 반대이므로 Objective-C에서 C로 전달되어 프로세스에서 개체의 보유 수를 증가시킵니다. ARC는 해당 객체에 관심을 나타내지 않습니다.

1

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 객체가 할당 해제 될 때 해제됩니다.