2011-12-22 2 views
0

이것은 초보자 용 질문입니다. 나는 변수 오늘 새 문자열이 필요, 그래서 나는이 같은 짓 :새 문자열 초기화

NSString* newString = nil; 
if(something) 
newString = @"a value"; 
else 
newString = @"different value"; 

을하고 그냥 괜찮 았는데. 그럼에도 불구하고, 나는 메모리 할당에 대해 조금 알고, 나는이 어떻게 든 문제가 발생할 수 있습니다 두려워, 그래서가 결국 코드를 ​​변경 : 그것은 내가 이전에 무슨 짓을했는지 나쁜 관행

NSString* newString = [NSString stringWithFormat:@""]; 
if(something) ... 

인가? 일부 변수는 자동으로 할당된다는 것을 알고 있으므로 alloc을 호출 할 필요가 없지만 nil로 초기화하지는 않습니다. 이 질문은 바보 같은 소리 경우 나는이 전무에 대한 질문 @ 대없는

[편집] 전무 .. 내가 PHP에서 오브젝티브 -C에 와서 메모리 관리에 대한 내 지식에 가까운, 미안 해요 ""; 제 질문은 단순히 NSString = something (nil, @ "", @ "a value")을 사용하는 것이 좋습니다. 일반적으로 객체에 대해이 작업을 수행하는 것이 좋습니다. if의 두 가지 newString에 값을 할당하기 때문에 대신 NSRandomObject = [[NSRandomObject* alloc] init]; 일을 단순히 NSRandomObject = aValue;

답변

2

을 수행 할 수 있습니다 예를 들어 은 이전 if에 할당이 적용되지 않습니다.

문자열을 nil으로 초기화할지 여부를 결정하는 것은 빈 문자열과 비교하여 응용 프로그램 수준의 결정이며, 종종 "문자열이 없습니다"와 "문자열이 있습니다."사이의 구별을 중심으로 이루어 지지만 빈".

+0

물론 효과가 없습니다. 그 아이디어는 다음과 같습니다. D NSString * theString = @ "something"을 사용할 수 없습니다. 내부에있는 if, 그리고 그 안에있는 theString은 제대로 선언되지 않았기 때문에 else 내부에 있습니다. 그래서 if/else 구조 앞에 빈 init을 사용했습니다. – BBog

+1

@BogdanBucur 만약'if'의 값을 무효로 할 경우 (무조건적으로)'nil'으로 초기화하는 것이 더 낫습니다. – dasblinkenlight

+0

고마워, 그게 내가 알아야 할거야! 나는 당신의 도움에 감사한다. – BBog

2

접두사가 @ 인 문자열은 프로그램 코드에 한 번만 저장되고 정적 주소로 사용됩니다. 기억에 대해 걱정할 필요가 없습니다. stringWithFormat를 사용하여 사실

, 단순히 @"string"

재미있는 사실보다 훨씬 더 많은 메모리를 차지한다 : 변수에 할당 할 때 @"this is a very long string"nil만큼이나 많은 메모리를 차지한다. 둘 다 메모리 주소입니다. 물론 문자열은 사용자의 메모리에 저장되지만 거의 모든 코드에서 다시 사용할 수 있습니다.

+0

그것은 정말로 재미있는 사실이다. 그래도 if/else 구조에서 변수를 사용하기 전에 변수를 선언해야하는 부분이 있습니다. 그래서 그것을 아무 것도 아닌 것으로 선언하고 나중에 올바른 값을 부여하는 것이 좋습니다. – BBog

+2

포인터의 내용은 항상 4 바이트 (또는 64 비트 아키텍처에서는 8)가됩니다. 초기 값을 할당하면이 4 바이트를 씁니다. 즉시 덮어 쓰면 8 바이트를 썼음을 의미합니다. 이것이 매우 중요하다면 초기 값을 지정하지 마십시오. 나중에 사용하기 전에 반드시 지정하십시오. –

+0

아니, 2 바이트가 정말로 중요 할 때 그런 응용 프로그램이 아닙니다. 이전에 본 것부터 obj-c에서 객체를 올바르게 할당하고 해제하는 것이 중요합니다. 예를 들어, 아무 것도 할당하지 않았고 변수를 할당 해제 할 때 일반적으로 수행하는 작업을 무효로 설정했습니다.그래서 거기에 내 관심사가 거짓말을했다 ... 나는 문자열이 단지 임의의 포인터를 받고, 다른 객체의 포인터를 덮어 쓰고 조만간 충돌로 이어질 것이라고 생각했다. – BBog

관련 문제