2011-02-08 7 views
3

저는 objective-c에서 새롭습니다, 이것이 제 첫 글입니다. 이것은 내 문제입니다 :NSString 변수를 함수에 전달하고 수정하십시오

내 주 파일에 변수가 있습니다 : NSString * var;

-(BOOL) myfunction:(NSString *)myvar { 
myvar = @"OK!"; 
return YES; 
} 

는 이제 기본 파일에 내가 할 : 은 그럼 기능이

NSString *var; 
BOOL control = myfunction:var; 
if(control) 
    NSLog(@"var is: %@",var); 

을하지만, 출력은 "VAR은 다음과 같습니다." 내가 디버그 모드에서 내장과 기능의 시작에 중단 점을 넣으면 myFunction이myVar에의 메모리 주소는 VAR 동일 하지만 할당 후 myVar에의 주소는 의 주소와 다른 var. 어떻게 해결할 수 있습니까? 미리 감사드립니다!

+0

그건 그렇고, 그 방법은 기능이 아닙니다. – jlehr

답변

1

구문 론적으로는 그렇게처럼 myFunction이 호출을 수정해야합니다 BOOL control = [self myfunction:var];

당신이 기본을 변경하려는 반면, 여기 myFunction이 안에 당신이 단지 지역 문자열 변수에 문자열 값을 할당하는 것이 진짜 문제 그것은 가리키는 문자열입니다. 이 보통의 Obj-C에서 잘못된 접근입니다,하지만 당신과 같이 그것을 할 수 있습니다 : 당신은 또한 NSMutableString을 사용할 수 있습니다

-(BOOL)myfunction:(NSString **)myvar 
{ 
    *myvar = @"OK!"; 
    return YES; 
} 

NSString *var; 
BOOL control = [self myfunction:&var]; 
if(control) 
    NSLog(@"var is: %@",var); 
+0

답변 해 주셔서 감사합니다! – Andrea

+1

참고로 * 통과를 사용하는 경우 잘못했음을 강조합니다 *. – bbum

4

.

-(BOOL) myfunction:(NSMutableString *)myvar { 
    [myvar setString:@"OK!"]; 
    return YES; 
} 

다음과 같이 전화 사이트를 변경합니다

NSMutableString *var = [NSMutableString string]; 
BOOL control = [self myfunction:var]; 
if(control) 
    NSLog(@"var is: %@",var); 
6

을 지금까지 주어진 답이 올 동안. 나는 더 적절한 질문이 당신이 이것을하고 싶어하는 이유라고 생각한다.

반환 코드가 성공 또는 실패를 나타내는 방어 프로그래밍 스타일을 원한다고 생각합니다. 이 작업을 수행하는 방법과 같은

더 오브젝티브 C는 문자열 매개 변수로 NSError **을 전달하고 작성하는 Error Handling Programming Guide

그래서 방법에 설명 된대로 문자열이나 실패를 표시하는 전무를 반환하는 것입니다

- (NSString *)aStringWithError:(NSError **)outError { 
    returnString = @"OK"; 
    if (!returnString) { 
     if (outError != NULL) { 
      NSString *myErrorDomain = @"com.company.app.errors"; 
      NSInteger errNo = 1; 
      *outError = [[[NSError alloc] initWithDomain:myErrorDomain code:errNo userInfo:nil] autorelease]; 
     } 
    } 
    return returnString; 
} 

그리고 그것을 사용하기 :이 될 것

NSError *error; 
NSString *stringVariable = [self aStringWithError:&error]; 
if (!stringVariable) { 
    // The function failed, so it returned nil and the error details are in the error variable 
    NSLog(@"Call failed with error: %ld", [error code]); 
} 

이 사소한 예이지만, 당신이 볼 수 있습니다 성공 여부에 관계없이 오류에 대한 의미있는 정보를 구성하고 반환 할 수 있습니다.

+0

+1,'newStringWithError :'는 소유 된 객체를 반환하거나 다른 이름으로 지정해야한다는 것을 제외하고는 정확합니다. 또한 역 참조를 시도하기 전에'if (outError! = nil)'을 점검해야합니다. Dereferencing'nil' *은 앱을 크래시합니다. 또한'if (! returnString)'조건은 항상 false입니다. –

+0

이름에 대해 좋은 점. 변경됨. outError가 NULL인지 확인했습니다. 이 경우 OP의 대답과 마찬가지로 함수가 실패 할 수는 없지만 NSError 객체를 만드는 데 더 많은 관심이있었습니다. – Abizern

관련 문제