2011-10-12 2 views
3

객관적인 C에 익숙하지 않은데 새로운 ARC 컴파일러로 코드를 컴파일 할 때 out 매개 변수를 사용하여 메서드를 만들고 호출하는 방법을 모르겠습니다.ARC의 매개 변수 출력 Objective C

이것은 ARC가 아닌 목표 C에서 수행하려고 시도한 것입니다 (어쨌든 이것은 잘못된 것입니다).

// 
// Dummy.m 
// OutParamTest 

#import "Dummy.h" 

@implementation Dummy 

- (void) foo { 
    NSString* a = nil; 
    [self barOutString:&a]; 
    NSLog(@"%@", a); 
} 

- (void) barOutString:(NSString * __autoreleasing *)myString { 
    NSString* foo = [[NSString alloc] initWithString:@"hello"]; 
    *myString = foo; 
} 

@end 

(의견이 일치하도록 수정 됨). http://clang.llvm.org/docs/AutomaticReferenceCounting.html

여기 : http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

...하지만 어려운, 올바른 아무것도 신경 쓰지 컴파일 아무것도 얻을 발견하고 내가 여기 설명서를 읽은

. 누구든지 ARC 목적 C에 적합한 방식으로 위의 코드의 jist를 다시 작성할 수 있습니까?

+0

정확히 무엇이 문제입니까? 어떤 컴파일러 오류가 발생합니까? –

+0

위의 코드 샘플을 제안 사항으로 업데이트하고 컴파일러 오류 집합을 포함 시켰습니다. 감사. – Ben

+0

업데이트 된 답변보기 컴파일러가 말했듯이, 당신은 간접적 인 포인터를 사용할 수 없다. 대신'& a'를 직접 전달해야한다. –

답변

8

당신은 out 매개 변수에 __autoreleasing 속성을 사용할 필요가 :

- (void) barOutString:(NSString * __autoreleasing *)myString { 
    NSString* foo = [[NSString alloc] initWithString:@"hello"]; 
    *myString = foo; 
} 

시험판 문서 (내가 NDA 때문에 링크를 허용하고 있지 않다) 두 '의 중간에 __autoreleasing을두고 * 's,하지만 그냥 작동 할 수도 있습니다 (__autoreleasing NSString **)

원본 코드에서와 마찬가지로 간접 더블 포인터 (b)를 사용할 수 없습니다.

- (void) foo { 
    NSString* a = nil; 
    [self barOutString:&a]; 
    NSLog(@"%@", a); 
} 

또한 완전히 잘못 인 객체에 직접 dealloc를 호출 :이 양식을 사용해야합니다. 메모리 관리 지침을 읽는 것이 좋습니다.

+1

첫 번째 방법에는 약간의 오류가 있습니다. '* myString = &foo;'는'* myString = foo;'로 변경되어야합니다. – diegoreymendez

+1

고마워요. 어떻게 거기에 들어 왔는지 확실하지 않습니다. –