2010-08-04 4 views
1

객관적인 C가 함수를 호출하기 전에 객체에 대한 포인터가 nil인지 확인하기를 원한다면 궁금합니다. 예를 들어 함수에 nil 객체 전달하기

는 myFunction이 내 자신의 기능을하고 있는지에 확인을하지 않습니다 어디

[self myFunction:ptr]; 

ptr = nil; 

및 전화 나는

myObject* ptr; 

및 초기화가 있다고 개체가 nil입니다. 나는 어딘가 객관적인 C가 nil이라면 함수를 호출하지 않을 것이라고 들었다. 이것이 사실이며 내 코드가 안전할까요?

내가 물어 보는 이유는 범용 앱을 구현하고 있으며 ipad에서만 작동하는 UIView 인스턴스가 있기 때문입니다. 하지만, 나는이 뷰에 대해 많은 함수 호출을하고 함수를 호출하기 전에 ipad인지 여부를 확인하기 위해 조건 검사를 수행하는 대신 iphone이라면 뷰를 nil로 설정할 수 있다면 좋을 것입니다.

또한 인터페이스 빌더가 객체를 할당하고 포인터를 nil로 설정하면 메모리 누수가 발생합니까 아니면 빌더가 객체를 dealloc할지 알 수 있습니까?

감사

답변

6

당신은 항상 nil 인수하는 방법을 제공 할 수 있습니다,하지만 난 당신이 오해가 무엇인지 생각은 nil 메시징에 관한 것입니다.

MyClass *object = nil; 
[object doSomething]; // nothing done, because object is nil 

object = [[MyClass alloc] init]; 
[object doSomething]; // does something, because object points to an instance 

인수로 nil 제공 설명하기 위해 다음의 경우

NSMutableDictionary *myDict = [NSMutableDictionary dictionary]; 
[myDict setObject:@"Value 1" forKey:@"Key 1"]; 
[myDict setObject:nil forKey:@"Key 1"]; // perfectly valid 
// myDict is empty again after setting nil value for "Key 1". 

myDict = nil; 
[myDict setObject:@"Value 1" forKey:@"Key 1"]; // nothing happens! 

위에서, 그리고 objectmyDict는 “ 수신기 ” 불린다. 수신자가 nil이면 조치가 수행되지 않습니다. 이것은 C, 예를 들어, 다른 프로그래밍 언어에 비해 상당히 다르다 ++ 다음은 유효하지 않습니다

메모리에 관해서는
MyClass *object = NULL; 
object->doSomething(); // oops, this is not allowed 
+2

예, 원래 포스터에게 명확한 이해를 위해 : 이해는 거꾸로입니다. ** 객체 **가'nil '이면 아무 일도 일어나지 않습니다. ** 인수 **가 nil 인 경우 메서드는 여전히 호출되며 예상대로 nil을 처리하거나 불어납니다. 논쟁을 둘러싼 마술은 없습니다. –

+0

답변 주셔서 감사합니다. 그래, 내 질문에 대답했다. 죄송합니다. 프로 시저 프로그래밍에서 왔고 OOP에 대한 많은 경험이 없으므로 인수를 전달하고 수신기 개념을 잊어 버렸습니다. 그래, 대부분 내 코드는 [myObject myFunction] 형식이므로 myObject를 nil로 설정할 수 있어야합니다. 시스템이 내 물건을 지나칠지 걱정됩니다. – user396004

+0

명시 적으로 전달한 인수 이외에 self 및 _cmd가 암시 적 인수로 모든 메서드에 있음을 알면 도움이 될 수 있습니다. 'self'(수신자)는 메소드가 호출 될 때 암시적인 인수 일뿐입니다. – NSResponder

0

, 당신은 NIB 파일의 개체가 다음에 전무로의 출구를 설정하는 경우 코드에서 메모리 누수가 발생합니다. 개체를 놓은 다음 nil로 설정해야합니다.

아이 패드라면 객체를 만들고 아이폰이라면 변수를 nil로 남겨 두는 것이 좋습니다. 그런 식으로 NIB 파일에 개체를 만들면 자르지 않을 수있는 누락 된 참조를 처리 할 필요가 없습니다. 그게 문제 일 수도 있고 아닐 수도 있지만 조건부로 파괴하는 것보다는 조건부로 만드는 것이 더 나을 것입니다.

+0

흠, 좋은 생각입니다. 나는 그것을 고려해야 만 할 것이지만, 아이폰 프로그래밍을 처음 접했을 때 인터페이스 빌더는 확실히 나를위한 버팀목이다. 수동으로 치수를 프로그래밍하는 것은 모든 세팅, 특히 세분화 된 컨트롤과 버튼과 같은 컨트롤에 지루할 수있다. . 또한, 내가 구축하고있는 코드는 주로 nib 파일을 사용합니다. 메모리 누수 캐치를 보내 주셔서 감사합니다! – user396004

+0

인터페이스 빌더는보기가 완료된 후 내 개체를 dealloc하려고하지 않습니다? release 또는 dealloc을 사용합니까? release 한 후에 dealloc을 시도하면 오류 오류가 발생합니다. 맞습니까? – user396004

+0

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html –

관련 문제