2010-06-21 14 views
1

내가 가지,있는 NSString의 행동 * str을 ..있는 NSString * str을

내가 여러 가지 방법으로 할당 혼동하고 때때로 작동하고, 가끔은 널 (null)이됩니다에 대한 혼란.

NSString *str = @"/hi/hello"; // this one always works 
// this sometimes becomes null after the function ends 
NSString *str2 = [str lastPathComponent]; 
// as above 
NSString *str3 = [NSString stringWithString:str2]; 
NSString *str4 = [NSString initWithString:str3]; 

Obj-C의 개체 동작에 익숙하지 않은데, C++과 비슷합니까? 그렇다면

, 어떻게 안전하게

string str = "hi"; 
string str2 = str; 

C++에서 동작합니다 같은 할당 할 수 있습니까?

예 : I는 함수가 종료 된 후에는 NULL이 될하지 않을 것이라고

어떻게 안전하게 할당, 내 .H 파일에 문자열을 선언?

매우 기본적인 질문이지만 NSString 참조 페이지에서 대답을 찾을 수 없습니다.

도움을 주셔서 정말로 감사드립니다.

답변

7

동작은 C++와 유사하지 않습니다. 객체는 참조 카운트됩니다. 당신이 주위에 하나를 유지하고 싶다면, 당신은 그것에 주장을해야합니다.

이름이 alloc, new 또는 copy 인 메서드로 개체를 직접 만드는 경우 소유권이 이미 있습니다. 이것은 C++ new과 같습니다. (alloc으로 객체를 만들었 으면 이름이 init으로 시작하는 몇 가지 메소드로 초기화해야하지만, 먼저 C++에서 작성해야합니다. 두 가지 모두 단일 작업으로 간주됩니다.

[object retain]을 호출하여 소유권을 명시 적으로 주장하지 않는 한 다른 메서드 (예 : 언급 한 NSString 메서드 중 2 개)에서받은 개체는 일시적으로 만 사용할 수 있습니다. 당신은 즉각적인 맥락을 초월하여 주위를 지키고 싶을 때만 이것을 할 필요가 있습니다. (실제로 C++에서는 이에 해당하지 않습니다.)

소유권을 얻지 만, 작업이 끝나면 [object release]으로 전화하여 소유권을 포기해야합니다. 이 종류는 C++ delete과 비슷합니다. 단, 소유권 주장이 모두 해제 될 때까지 객체가 실제로 삭제되지 않는다는 점이 다릅니다.

그립을 얻는 것은 정말로 정말로 중요합니다. 아마도 Objective-C를 사용하기 위해 알아야 할 중요한 것입니다. 신중하게 object ownership documentation을 읽고 정렬됩니다.

+0

정말 고마워요! – Frost

+3

객체가 할당 해제 된 경우에도 객체가 마술처럼 쓸모 없게되지는 않습니다. 할당 취소 된 객체에 액세스하는 것은 잘못된 것입니다. 프로그램이 중단되거나 더 이상 할 수 있습니다. – Chuck

2

가비지 수집을 사용하지 않는다고 가정합니까? 이 경우 문자열을 유지해야합니다.

NSString* str2 = [[str lastPathComponent] retain]; 

객관적인 - c 메모리 관리에 대해 읽어 보시기 바랍니다.

+0

처럼 구현 파일에 정적 문자열을 만들어야합니다 ..><'str2' (등)가 인스턴스 변수 나 전역 변수 경우에만 진정한 – Frost

+0

. 지역 변수에 할당 한 모든 것을 유지할 필요는 없습니다. –

+1

동의하지만 그는 지역 변수가 아니라는 것을 의미하는 변수가 끝나면 변수가 0이되었다고 말했습니다. – Gary

2
NSString *str = @"/hi/hello"; 

이것은 문자열 리터럴을 만들기 때문에 효과가 있습니다.이 질문에 대한 답변이 당신이 오토 릴리즈 문자열을 생성하는 모든 경우에 목표 - C

What's the difference between a string constant and a string literal?

에서 이해하기 읽기 가치가있다. 응용 프로그램의 runloop으로 돌아 가면 할당 취소됩니다. 이 마지막에

NSString *str2 = [str lastPathComponent]; 
NSString *str3 = [NSString stringWithString:str2]; 

난 당신이 [[NSString alloc] initWithString:str3]

이 유지되는 문자열을 생성을 의미 가정합니다. 그러나 이것은 정적 문자열을 만드는 좋은 방법이 아닙니다. 당신은 내가 그것을 읽어 줄 테니, 감사이

static NSString *myConstant = @"constantString" 
+0

감사합니다. 분명합니다! – Frost