2009-12-19 2 views
0

내 .m 파일에서 채우고 다시 사용하려는 문자열 (현재 내 .h 파일에 정의되어 있음)이 있습니다. 여기 동일한 .m 파일에서 NSString 재사용

는 설정이다 :

  1. 사용자가 내 인터페이스 btnA이 메소드를 실행
  2. (buttonAClicked)에 btnA을 클릭 할있는 NSString의 값을 설정에 "foo는"
  3. 사용자가 내 인터페이스에서 btnB을 클릭
  4. btnB는 NSString의 값 (예 : "foo")을 반환하는 메서드 (buttonBClicked)를 실행합니다.
  5. 사용자가 btnA를 다시 클릭하고 메서드가 NSString "새 값"을 업데이트합니다 ...
  6. 이익! 나는 더 이상 countOfMatches 문자열을 읽을 수없는 것 같습니다

    I 방법에 대한 아이디어 -

    /* Modal_TestAppDelegate.h */ 
    // in the @interface block // 
    @public 
    NSString *countOfMatches; 
    // in the main area of the .h // 
    @property (nonatomic, readwrite, reatain) NSString *countOfMatches; 
    /* Modal_TestAppDelegate.m */ 
    @synthesize countOfMatches; 
    -(void)applicationDidFinishLaunching:(UIApplication *)application{ 
    ... other code ... 
    self.countOfMatches = [[NSString alloc] initWithFormat:@"0"]; 
    } 
    -(void)updateButtonClicked:(id)sender{ 
    countOfMatches = @"1"; 
    NSLog(@"countOfMatches is now: %@",countOfMatches); 
    } 
    -(void)readButtonClicked:(id)sender{ 
    NSLog(@"I wonder what countOfMatches is set to now? %@",countOfMatches); // CRASH! 
    } 
    

    나는 충돌하고있어 어디에 "readButtonCicked 영역은 다음과 같습니다

는 일부 코드입니다. 단일 클래스 전체에서 단순히 "변수"를 재사용 할 수 있습니다 (.m 구현을 "클래스"라고 올바르게 호출하는 경우). 이것이 내 첫 번째 시도이며, 필자가 가지고있는 여러 Xcode 및 iPhone SDK 책에서 페이지를 추출하고 있습니다.).

고마워!

답변

4

NSString 속성을 copy이 아니라 retain으로 설정해야합니다. (더 here) 또한이 라인에서 메모리가 누수하고

@property (nonatomic, readwrite, copy) NSString *countOfMatches; 

self.countOfMatches = [[NSString alloc] initWithFormat:@"0"]; 

그것은

self.countOfMatches = [[[NSString alloc] initWithFormat:@"0"] autorelease]; 

또는 더 나은 수 :

self.countOfMatches = [NSString stringWithFormat:@"0"]; 

또는 최고 (그리고 정말로, 그것이 무엇 )해야한다 : NSString의 "형식"방법을 사용하여 아무 의미가

self.countOfMatches = @"0"; 

없다 - 당신은 정적 문자열로 설정하고 있습니다. 당신이 실행 루프의 통과가 완료되면, 그것은 -release 메시지가 나타납니다 즉, 오토 릴리즈되어 updateButtonClicked:

문자열 리터럴에서 @"1" 리터럴 문자열로 countOfMatches을 설정할 때

+0

정리 해줘서 고마워 - 이제 어떻게하면 두 번째 작업 내에서 액세스 할 수 있습니까? 게시 한 내용을 테스트 해보지 만, "readButtonClicked"메소드 내부의 countOfMatches에 여전히 액세스 할 수없는 것 같습니다. –

+0

핫도그! 그게 효과가있는 것 같습니다. 지금, 내 "- (void) readButtonClicked : (id) 보낸 사람 { NSLog (@"countOfMatches가 현재 설정되어있는 것은 아닌가? % @ ", countOfMatches); // CRASH! } "countOfMatches"반환. 마지막으로, 웹 페이지의 오른쪽 부분을 scrollTo하기 위해 UIWebView에서 일치하는 항목의 수가 실제로 반복됩니다. 엄청 고마워! –

+0

음, countOfMatches는 readButtonClicked의 범위 안에 존재하지 않으며 updateButtonClicked와 readButtonClicked가 같은 레벨에 존재하기 때문에 두 메소드 모두 countOfMatches를 "볼"수 있어야합니다. –

0

귀하의 문제가 발생한다.

최상위 메소드가 완료되면 실행 루프가 완료됩니다. 즉, updateButtonClicked: 메소드가 제대로 작동하지만 완료되면 countOfMatches가 가비지 메모리를 가리 킵니다.

업데이트 버튼을 누른 후 읽기 버튼을 누르면 응용 프로그램은 countOfMatches가 가리키는 메모리에서 가비지를 찾게됩니다. 이것이 애플리케이션이 충돌하는 이유입니다.

두 가지 가능한 솔루션은 존재합니다

  1. 액세스 당신을 위해 메모리 관리 담당하게 될 것 속성을 통해 변수 :

self.countOfMatches = @"1";

  1. 변수에 직접 액세스하여 문자열 리터럴을 유지합니다.

+0

정말요? 리터럴은 실제로 문자열을 풀로 만들었을 때 실수로 [@ "1"릴리스를 할 때] 문제를 방지하기 위해 실제로 유지/해제 할 수 없다고 생각했습니다. –

0

이 속성에는 복사 특성이 있으므로 할당 된 모든 내용의 복사본을 만듭니다. 즉, 보유 특성 (보유 개수가 1 인 사본)이 중요하므로 중요하지 않습니다. 문자열 리터럴인지 아닌지를 나타냅니다.

하지만 약간의 문제가 있습니다. 값을 변경하려고한다면 NSInteger 또는 NSUInteger로 저장하지 않으시겠습니까?

다른 곳에서 NSString을 가져 오는 경우 NSString 메서드 -integerValue를 사용하고 번호를 저장하십시오.

문자열로 countOfMatches이 필요하면 언제든지 NSNumber을 사용하여 값을 문자열 양식에 즉시 가져올 수 있습니다. 또한 지역화 된 문자열 값을 얻을 수 있다는 이점이 있습니다. 당신이있어 초기 언어가 아닌 다른 언어로 사용할 수 있도록하려는 여부를

NSString* countOfMatchesStr = [[NSNumber numberWithInteger:self.countOfMatches] descriptionWithLocale:[NSLocale currentLocale]];

모든 좋은 코코아 또는 코코아 터치 응용 프로그램이 처음부터 internationalizable해야한다 : self.countOfMatches는 지금 NSInteger이라고 가정 그것을 작성

최소한 다음을 수행 의미

:. 새 Xcode 프로젝트를 만들 때마다

  • 는, 각 XIB 파일을 선택 그것에 정보를 얻을, 클릭 일반 탭 및 창 하단에서 파일 로컬 화 가능 확인을 클릭합니다. xib 파일을 프로젝트 수준에서 XXXX.lproj라는 하위 폴더로 이동하기 때문에 버전 관리로 프로젝트를 가져 오기 전에이 작업을 수행하는 것이 좋습니다. XXXX는 작업중인 언어의 언어 코드입니다.

  • 사용자 대면 문자열 리터럴을 소스 코드에 삽입하지 마십시오! .strings 파일 만들기 : 새 파일을 만듭니다. 템플릿 창이 나타나면, Mac 섹션에서 Resource를 선택한 다음 .strings 파일을 선택하십시오. 파일 이름을 Localizable.strings으로 지정하고 프로젝트에 저장하십시오. 그런 다음 마지막 글 머리 부분의 단계를 수행하여 실제로 지역화 할 수있게하십시오.

  • 소스 코드에 넣은 모든 문자열 리터럴에 대해서는 NSLocalizedString(@"My Button Label", @"an optional comment, use empty string if no comment");을 호출하여 포장하십시오. .strings 파일의 내용을 포맷하는 방법에 대해 자세히 알려 드리겠습니다.

관련 문제