2011-02-05 5 views
0

objective-C에서 nil에 대해 혼란 스럽습니다. 원인 apple은 nil 객체에 메시지를 보내는 것이 좋습니다. 엑스 코드에서Objective-C unallocated pointer

Foo * myFoo; 
[myFoo doSomeStuff]; 

이 그렇게 충돌 왜하지 않습니다

때문에이 코드를 생각? objective-C에서 할당되지 않은 포인터는 nil과 같습니다.

감사합니다.

+0

은 'myFoo' 글로벌 변수입니까? 그것들은 항상 0으로 초기화됩니다. – pt2ph8

+0

myFoo는 전역 변수가 아닙니다. – iPadDevloperJr

+0

@Gallois : 할당되지 않은 포인터와 초기화되지 않은 포인터 사이에는 차이가 있습니다. 초기화되지 않은 포인터가 있고 포인터가 스택 (로컬 변수)에 할당되고 초기화되지 않은 경우 응답에 설명 된대로 동작이 정의되지 않습니다. –

답변

3

nilrandom garbage 사이에 차이가 있기 때문에 당신이 명시 적으로 설정하지 않는 경우

Foo * myFoo; 

myFoo의 가치에 대한 보장하지 않습니다 : 당신은이 줄을 참조하십시오. 자신을 위해보십시오 :

Foo* myFoo; 
printf("%x\n", myFoo); 

0를 인쇄 할 가능성이 높습니다; 대신, 그 메모리 위치에 있었던 마지막 일을 인쇄합니다. (일 수도 있고 일 수도 있습니다.) 매우 편리 할 수도 있습니다.

로컬 변수는 사용자가 직접 할당하기 전에 정의되지 않은 값을 갖습니다. Objective-C 런타임은 nil에 대한 호출을 허용하지만 nil은 0으로 엄격하게 정의됩니다. 따라서이 기능을 사용하려면 변수를 nil으로 초기화해야합니다. 그렇지 않으면 메시징 (메시징)이 필요하기 때문에 세그먼트 오류가 발생할 수 있습니다. 임의의 주소는 프로그램에 좋지 않습니다).

이 항상 "작업"("작업"에 의해 나는 충돌하지 의미)한다 :

Foo* myFoo = nil; 
[myFoo whatever]; 
다음

내 컴퓨터와 함께, 지속적으로 포인터를 제로하지 않는, 예를 들어 프로그램입니다 :

#include <stdio.h> 
#include <string.h> 

struct random_stuff 
{ 
    int stuff[60]; 
}; 

struct random_stuff scramble() 
{ 
    int filler = 0xdeadbeef; 
    struct random_stuff foo; 

    memset_pattern4(&foo.stuff, &filler, sizeof foo); 
    return foo; 
} 

void print() 
{ 
    void* pointer[30]; 
    for (int i = 0; i < 30; i++) 
     printf("%p\n", pointer[i]); 
} 

int main() 
{ 
    scramble(); 
    print(); 
} 
+0

나는 그것을 시도하고 0을 출력한다. – iPadDevloperJr

+0

@Gallois 아주 간단한 프로그램 (기본 방법)에서는 0을 인쇄하는 것이 가능하다. 나는 '0'을 출력하지 않는 예제로 업데이트 할 것이다. . – zneak

+0

고마워,하지만 내 문제는이 충돌하지 않는다는 것입니다. Objective-C는 할당되지 않은 포인터를 nil과 동일하게 취급합니다! – iPadDevloperJr

3

변수에 따라 다릅니다. 인스턴스 변수, 전역 변수 또는 정적 변수는 초기화하지 않으면 nil로 초기화됩니다. 일반 지역 변수는 정의 된 값으로 초기화되지 않고 일반적으로 충돌하는 변수를 메시징합니다. 그게 보통, 아니 항상 - 당신이 정의되지 않은 동작에 대해 얘기 할 때, 충돌, 메시지를 잘못된 개체로 이동하는 등의 거의 모든 작업이 가능합니다. 또는 대부분의 시간이 맞고 무작위로 실패하는 동작 .

관련 문제