2014-04-11 4 views
0

안녕하세요 저는 간단한 목표를 가지고 있습니다. 저는 회사 코드베이스를 살펴 봤고 재미있는 것을 발견했습니다. 언제 [[alloc] init]을 사용해야하며 언제 그렇지 않아야합니까?objective-c에서 alloc init을 사용하는 경우

사례 1 :

NSString *url = nil; 
url = @"hi"; 

사례 2 : 여기에 전형적인 예이다

NSString *url = [[NSString alloc] init]; 
url = @"hi"; 

그래서 사례 2 사용해야 할 때 케이스 1 사용해야합니까? 누군가가 나를 위해 일단이 모든 것을 해결할 수 있기를 바란다. 내 앱 개발 전반에 걸쳐 나는 C++ (기본적으로 객체 생성자를 호출)에서 "새로운"을 호출하는 것과 같다고 생각했기 때문에 Case 2를 사용했다. 케이스 1은 해당 객체에 대한 생성자 또는 메모리 할당의 호출을 나타내지 않으므로 케이스 1조차도 작동한다는 것이 충격적입니다. 사례 1은 내가보고있는 코드 기반 어디에서나 사용된다.

+1

Objective-C에 C++ 메 커닉을 적용하지 마십시오. ObjC는 C++과 달리 연산자 오버로딩을 제공하지 않으므로 Objc 객체 (예 : 내부 값 할당)의 조작은 항상 해당 클래스와 연결된 메서드를 통해 수행되며 '='연산자는 사용하지 않습니다. –

+0

또한'[[... alloc] init '을 사용하는 대신'[... new]'를 사용할 수도 있지만, 처음에는 당신이 쓸데없는 부분을 – aguilarpgc

답변

1

alloc은 개체를 만듭니다. 따라서 클래스의 인스턴스를 만들 때 사용할 수 있습니다. 이 경우 변수에 기존 객체 @ "hi"를 지정하기 때문에 객체를 만들고 싶지 않습니다. 따라서 객체를 생성하고 즉시 다른 객체에 대해 폐기하므로 사례 2를 작성하지 않아야합니다.

2

alloc은 저장소를 생성하고 기본 자동 설정을 수행하여 클래스의 인스턴스를 반환합니다. init을 사용하면 인스턴스가 해당 클래스에 필요한 로직에 따라 자체 구성 할 수 있습니다. =은 포인터에 다른 인스턴스를 지정합니다.

첫 번째 문자는 항상 정확하며 두 번째 문자는 항상 올바르지 않습니다. 객체의 인스턴스를 생성 한 다음 나중에 한 행을 버리는 것은 없습니다.

:; @

2

는 "안녕하세요"는 NSString의 인스턴스를 생성 (옆으로 귀하의 경우 당신은 다음 이유로 인해 할당에 관계없이 그것을 건너 뛸 수 ARC와 함께 당신은 항상 암시됩니다으로 = nil를 건너 뛸 수 있습니다). 할당 및 초기화를 수행합니다. 따라서 2의 경우, 메모리를 무의미하게 할당 한 다음 "url"포인터를 새 메모리 조각에 다시 할당해야합니다.

"url"은 포인터라는 것을 명심해야합니다. C 또는 C++에서와 마찬가지로, "="연산자를 사용하여 가리키는 곳에서 다시 할당하고 있으면 가리키는 데 사용 된 메모리에 영향을 미치지 않습니다. C에서 새로 할당 된 메모리에 저장된 값을 변경하려면 참조 해제 연산자를 사용해야합니다.

+0

으로 사용자 정의 할 수 있습니다. 객관적인 c의 특별한 경우? – AyBayBay

+0

문자열은 특별한 경우가 아닙니다. Objective-C는 기본 객체를보다 간결하게 생성하기위한 몇 가지 헬퍼 (리터럴이라고 함)가 있습니다. @ "hi"는 문자열 할당 및 생성으로 확장됩니다. @ [object1, object2, object3] 및 사전의 리터럴 : @ {@ "key1": object1, @ "key2": object2}도 배열의 리터럴입니다. 이러한 리터럴은 더 간결한 코드를위한 것입니다. 그러나 NSString, NSArray 및 NSDictionary는 일반적인 개체입니다. – drewag

+0

@AyBayBay : 상수 문자열은 실제로 특별한 경우입니다.그것들은 (적어도 필자가 익숙한 구현에서) 바이너리의 데이터 섹션에 살고 동일한 번역 단위의 동일한 문자열 상수가 실제로 같은 문자열이되도록 통일 된 불멸의 객체입니다. 그러나 메모리 관리 의미론의 관점에서, 그들은 정말로 특별하지 않습니다. 대부분의 프로그램은 값이 문자열 상수인지 여부를 모르기 때문에 다른 문자열과 같이 처리 할 수 ​​있습니다. – Chuck

관련 문제