nil 및 null 및 NSNull 차이점 및 관련 질문
2726 단어 Objective-CnullCrashNSNull
nil 및 null 및 NSNull 차이점 및 관련 질문
1. nil과 null은 글자의 뜻에서 쉽게 이해할 수 있다. nil은 하나의 대상이고 Null은 하나의 값이다. 나는 nil은 대상을 공백으로 설정하고 null은 기본 유형을 공백으로 설정한다. 개인적인 느낌은 약간 속성과 같다. 기본 유형은 assign NSString 유형으로 나누면 copy를 일반적으로 분배하고 대상은 보통retain을 사용한다.그리고 우리는nil 호출 방법에 대해crash나 버퍼링 이상이 발생하지 않습니다.
한 단락을 보다
nil -> Null-pointer to objective- c object
NIL -> Null-pointer to objective- c class
null-> null pointer to primitive type or absence of data.
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil ,Nil ,NULL 。 nil,Nil, NULL 。
2. NSNULL, NULL과 nil은 본질적으로 똑같아야 한다. NULL과 nil은 사실 0이다. 그러나 Objective-c에서 NSArray와 같은 유형에 대해 nil이나 NULLL은 그 중의 Object로 할 수 없다. 만약에 NSArray를 정의하여 메모리를 분배하고 그 중의 내용을 비워 두려고 한다.[NSNULL null에서 되돌아오는 대상을 사용하여 NSArray의 내용을 초기화할 수 있습니다. 제 느낌은 C 언어의malloc 메모리 공간과 비슷하고memset으로 이 공간의 값을 0으로 초기화합니다.
_viewControllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < _pages; i++) {
[_viewControllers addObject:[NSNull null]];
}
ymBaseController *controller = [_viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
...
}
[_viewControllers replaceObjectAtIndex:page withObject:controller];
3. 연구할 수 있는 문제 하나
dealloc에서
-(void) dealloc
{
self.test = nil;
[_test release];
test = nil;
}
이 몇 개의 차이
제일 쉬운 거 먼저.
[_test release]; 이것은 인용 기술을 1로 줄이는 것이다. 이른바 인용 계수란 여러 개의 바늘이 하나의 메모리 실체를 가리키는 것을 보는 것이다. release가 한 번에 바늘이 하나를 줄이면release가 0이 되면 이 메모리를 시스템에 진정으로 돌려줄 때이다.
그리고 셀프.test = nil;속성과 setter, Getter 방법을 설명하면 어렵지 않아요.
-(void) setTest:(NSString *)newString
{
if(_test != newString)
[_test release];
_test = [newString retain];
}
-(NSString *)test
{
return
_test;
}
이것은setter와getter 방법입니다. 이 문제에서 아까 코드가 바뀐 것과 같습니다.
if(_test != nil)
[_test release];
_test = nil;
지금은 쉽게 설명할 수 있다. setter 방법은retain nil 대상을 할 수 있다. 그 전에 이미release가 오래된 대상을 만들었다. 이 방법의 장점은 구성원 변수가 랜덤 데이터를 가리킬 기회조차 없고 다른 방식을 통해 랜덤 데이터를 가리키는 상황이 나타날 수 있다는 것이다.release가 끝난 후에 만약 다른 방법으로 그것을 저장해야 한다면, dealloc가 이미 dealloc가 되었다면,crash가 되고,nil을 가리키면 오류가 발생하지 않을 것입니다.nil은 말하자면 계수기가 0이라고 한다. 이렇게 말하자면, 진정release의 대상이 될 때 NSLog는 가리키는 메모리 컨트롤을 출력할 수 없고, nil일 때 가리키는 메모리 공간을 출력할 수 있다.
그럼 지금도 테스트 = nil 설명하기 어렵지 않아요.
단순히 이런 용법은 자신이 자신에게 메모리 유출을 만들었다고 할 수 있는데, 여기서 이렇게 이해할 수 있는 것은 대상을 가리키는 지침을 대상과 직접적으로 일도양단하는 것과 같다.테스트가 nil을 가리키도록 합니다. 메모리 실체는 사라지지 않고 시스템 회수도 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PreferenceBundle에서 오른쪽 상단에 Respring 버튼을 클릭합니다.만나서 반갑습니다, Minazuki라고합니다. 프로필 이름 : Minazuki_dev Twitter : Repo : 아직 중학생이므로 말이 이상한 곳이 있습니다만 용서해 주세요… 🙏 theos (Mac이든 단품이든 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.