2014-11-15 3 views
0

내가 궁금해하는 것과 관련한 아래로 내려간 예제 ... 그래서 사용자 정의 클래스가 있고 클래스의 인스턴스를 선언합니다.왜 개체 속성에 값을 할당하기 전에 클래스의 인스턴스를 할당해야합니까?

MyCustomClass * objectA;

objectA.property = value;

IF NSLog (@ "print the value : % @", objectA.property);

nil을 반환합니다.

지금 내가 선언 한 경우 ... MyCustomClass * objectA = [MyCustomClass alloc] init];

후 값의 지정 ...

objectA.property = 값;

모든 그것이 내가이 코드에서 속성의 할당하고 있음을 볼 때 X-코드가 자동으로 메모리에 객체를 생성하지 왜 궁금 ... 궁극적으로

모든 낙천적이다. 개발자의 관점에서 볼 때 나에게 도움이되지 않는 것이 좋습니다.

+0

이것은 Xcode와 아무 관련이 없습니다. Objective-C가 런타임에 어떻게 작동하는지에 관한 모든 것입니다. – rmaddy

답변

1

코드에서 속성을 할당하고있는 것을 볼 때 X-Code가 자동으로 개체를 메모리에서 인스턴스화하지 않는 이유가 궁금합니다.

MyCustomClass을 인스턴스화하는 올바른 방법은 무엇입니까? 종종 예제 코드처럼 allocinit만큼 충분합니다. 그러나 많은 경우에 이것은 지정된 이니셜 라이저를 호출하지 않기 때문에 작동하지 않는 오브젝트가 손상 될 수 있습니다. 예를 들어, MyCustomClassNSManagedObject의 하위 클래스 인 경우 init을 호출하면 쓸모없는 객체가 생성됩니다.

Swift에서 클래스는 지정된 초보자와 편의 이니셜 라이저를 구분할 수 있지만 설명대로 개체를 자동으로 인스턴스화하는 것은 안전하지 않습니다. 지정된 이니셜 라이저는 일반적으로 제대로 작동하려면 초기화 프로그램에 하나 이상의 인수를 제공해야하기 때문에 존재합니다. 예를 들어, 객체가 NSString이면? 당신은 allocinit으로 전화를 걸 수 있지만, 그렇게하는 것은 거의 항상 잘못된 것입니다. 객체를 자동으로 인스턴스화 할 때 어떤 인수를 사용해야합니까? Xcode 나 Clang 모두 Objective-C 실행 시간을 실제로 알 수없고 어느 것도 실행할 수 없습니다.

+0

당신은 큰 포인트를 거기에 ... 마치 당신이 정말로 같은 것을하고 싶을지도 모른다. ... NSArray * array = [NSArray alloc] initWithObjects : <#(id), ...#>, nil]; 좋은 설명입니다. 시간을내어 주셔서 감사합니다. –

2

Tom이 대답하는 이유는 런타임이 이 아니기 때문에 개체를 안전하게 초기화 할 수 없음을 의미합니다.

다음은 이것입니다 : Objective-C는 "해야한다고 말할 수 있기 때문에"당신을 위해 아무것도하지 않습니다. 자동 마법은 없습니다. 객체를 원한다면 객체를 초기화합니다. 그렇지 않으면 포인터가 nil입니다.

컴파일러는 점점 더 똑똑해지고 있습니다.하지만 사실은 그렇습니다. 그런 종류의 "객체를 만들려고 했음에 틀림 없으므로 저는 단지 당신을 위해 그것을 할 것입니다"라는 말은 프로그래머가 프로그래머가 말할 수 없다는 것을 의미합니다. 확실히 무슨 일이 일어나고 있는지.

일부 제 4 세대 (해석 된) 언어는 이와 같이 설정되지만 일부 컴파일/3 세대 언어는 생각할 수 없습니다.

+0

그리고 또 다른 좋은 지적이 있습니다. 컴파일러가 "가정"을하기 시작했다면 컴파일러가이를 처리 할 것이라고 생각했기 때문에 "코드의 균열"이 너무 많습니다. 나를. 규칙이 때때로 강화되기 때문에 훨씬 더 빨리 디버깅 할 수있는 것은 어려운 규칙입니다. 항상 모든 규칙에 예외가있는 것으로 보이지만 여기의 나의 하위 레벨에서는 규칙을 아는 것이 규칙을 깨고 작동 코드를 유지하는 것보다 더 중요하다고 생각합니다. 시간을내어 주셔서 감사합니다, 던컨! -Wade –

1

이미 많은 좋은 답변이 있습니다. 여기 또 하나의 각도가 있습니다.

당신은 쓸 때 : 컴파일러에 무슨 말을하는지

MyCustomClass *objectA; 

objectA이 이름은 당신이의 객체를 저장하는 기대 메모리에 위치 --- 주소 ---위한 것입니다 클래스 MyCustomClass. 당신은 아직 그러한 대상을 실제로 만들지 않았습니다.

alloc/init으로 새 주소를 작성하면 해당 주소에 MyCustomClass 인스턴스를 추가 할 수 있습니다. 그러나이 시점에서 당신은 할 필요가 없으며, 컴파일러는 당신이 할 수 있다고 가정 할 수 없습니다. 어떤 다른 클래스에서 다른 메서드를 호출하여 MyCustomClass을 반환하거나 배열에서 하나를 꺼내는 등의 다른 메서드를 호출 할 수도 있습니다.

개체가 아직 없기 때문에 하나의 속성을 설정할 때 아무런 효과가 없습니다. 그래서, 당신은이 때

objectA.property = value; 

를 호출 할 때, objectA는 무풍 아무것도 빈 주소입니다. ObjC의 규칙 중 하나는 당신이 무언가를하려고 할 때 아무 일도 일어나지 않을 때 당신은 아무것도 얻을 수 없다는 것입니다. (이 기능은 때때로 유용 할 수 있으며 다른 사람들을 좌절시킬 수 있습니다.) 그래서이 줄은 아무 작업도하지 않습니다.

+0

OP는 객체에 대한 포인터 유형을 선언 할 때와 객체에 대해 메모리를 할당 할 때의 차이를 OP가 이해한다는 것을 전제로하지 않기 때문에 더 나은 대답입니다. (나는 그/그녀를위한 혼란의 근원이라고 생각한다.) – Aky

+0

그랬어! 정말 고마워. 네, 맞아요! 당신이 무언가를하려고 할 때 아무 일도 일어나지 않고 당신은 아무것도 얻지 못합니다. 그것은 때때로 절망적 일 수 있습니다. 모바일 제작자의 선생님은 제가 앞으로 나아갈 때 앞으로 따라야 할 좋은 규칙을 주셨습니다. 먼저, 내가 필요한 모든 것을 로컬에서 인스턴스화하고 메서드 내에서 alloc을 사용하여 모든 것을 함께 볼 수 있도록합니다. 대답 할 시간을내어 주셔서 감사합니다. "그는"이것에 대해 매우 감사합니다! 롤. –

관련 문제