objective-C에서 nil에 대해 혼란 스럽습니다. 원인 apple은 nil 객체에 메시지를 보내는 것이 좋습니다. 엑스 코드에서Objective-C unallocated pointer
Foo * myFoo;
[myFoo doSomeStuff];
이 그렇게 충돌 왜하지 않습니다
때문에이 코드를 생각? objective-C에서 할당되지 않은 포인터는 nil과 같습니다.
감사합니다.
objective-C에서 nil에 대해 혼란 스럽습니다. 원인 apple은 nil 객체에 메시지를 보내는 것이 좋습니다. 엑스 코드에서Objective-C unallocated pointer
Foo * myFoo;
[myFoo doSomeStuff];
이 그렇게 충돌 왜하지 않습니다
때문에이 코드를 생각? objective-C에서 할당되지 않은 포인터는 nil과 같습니다.
감사합니다.
nil
과 random 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을 출력한다. – iPadDevloperJr
@Gallois 아주 간단한 프로그램 (기본 방법)에서는 0을 인쇄하는 것이 가능하다. 나는 '0'을 출력하지 않는 예제로 업데이트 할 것이다. . – zneak
고마워,하지만 내 문제는이 충돌하지 않는다는 것입니다. Objective-C는 할당되지 않은 포인터를 nil과 동일하게 취급합니다! – iPadDevloperJr
변수에 따라 다릅니다. 인스턴스 변수, 전역 변수 또는 정적 변수는 초기화하지 않으면 nil로 초기화됩니다. 일반 지역 변수는 정의 된 값으로 초기화되지 않고 일반적으로 충돌하는 변수를 메시징합니다. 그게 보통, 아니 항상 - 당신이 정의되지 않은 동작에 대해 얘기 할 때, 충돌, 메시지를 잘못된 개체로 이동하는 등의 거의 모든 작업이 가능합니다. 또는 대부분의 시간이 맞고 무작위로 실패하는 동작 .
은 'myFoo' 글로벌 변수입니까? 그것들은 항상 0으로 초기화됩니다. – pt2ph8
myFoo는 전역 변수가 아닙니다. – iPadDevloperJr
@Gallois : 할당되지 않은 포인터와 초기화되지 않은 포인터 사이에는 차이가 있습니다. 초기화되지 않은 포인터가 있고 포인터가 스택 (로컬 변수)에 할당되고 초기화되지 않은 경우 응답에 설명 된대로 동작이 정의되지 않습니다. –