Objective-C 객체가 스택이 아닌 스택에 저장되는 이유

1903 단어

1. 창고 대상과 무더기 대상은 무엇입니까


Objective-C에서 객체는 일반적으로 특정 레이아웃이 있는 연속 메모리 영역을 의미합니다.우리는 보통 이렇게 대상을 만든다
NSObject *obj = [[NSObject alloc] init];

이 코드는 NSObject 형식의 바늘obj와 NSObject 형식의 대상을 만들었습니다.obj 바늘은 창고에 저장되고, 가리키는 대상은 더미에 저장됩니다.
현재 OC는 창고에서 직접 대상(창고 대상)을 만드는 것을 지원하지 않지만, 다음과 같은 방식으로 간접적으로 만들 수 있습니다.
struct {
Class isa;
} fakeNSObject;
fakeNSObject.isa = [NSObject class];

NSObject *obj = (NSObject *)&fakeNSObject;
NSLog(@"%@", [obj description]);

2. 창고 대상의 장단점


1. 장점

  • 속도는 창고에서 대상을 만드는 것이 매우 빠르다. 많은 것들이 컴파일할 때 확정되기 때문에 실행할 때 공간을 분배하는 데 시간이 거의 걸리지 않는다.상대적으로 더미 위에서 대상을 만드는 데 시간이 많이 걸린다.
  • 단순역 대상의 생명주기는 확정된 것으로 대상이 출고된 후에 방출되고 메모리 유출이 존재하지 않지만 이것 역시 창고 대상의 가장 큰 단점이다.

  • 2. 결점

  • 생명주기 고정 OC 변수의 유효 범위는'{}'에 포함된 블록에 의해 결정된다. 즉, 대상을 찾는 생명주기는 그곳에 있는 블록에만 한정된다. 블록이 나오면 바로 방출되고 한 대상이 만들어진 후에 다른 방법으로 호출되어 전달될 수 있다. 대상을 찾는 창설 방법이 되돌아올 때 창고 대상은 함께 팝업되어 방출되어 다른 곳에서 계속 보유할 수 없다.이때retain 작업은 이 창고의 대상을 가지고 싶은 곳에서 자신의 사이트 대상을 다시 복사하지 않으면 효력을 상실합니다.따라서 창고 대상은 대상의 메모리 관리에 커다란 번거로움을 초래할 수 있다.
  • 공간은 현재 운영체제의 창고와 라인이 연결되어 있고 창고 공간은 유한하다. 구체적으로는 다음과 같다.
  • 512 KB (secondary threads)
    8 MB (OS X main thread)
    1 MB (iOS main thread)
    

    따라서 대상이 창고에 생성되는 것은 현실적이지 않고 물리적 메모리가 경고하지 않으면 무한히 사용할 수 있다.이상의 장단점을 종합하여 OC는 퇴적 저장 대상을 선택한다.

    정말 애인이 없습니까


    실제로 OC의 Block은 창고 대상이기 때문에 창고 대상이 직면하는 문제는 Block에게 적지 않다. 그러나 Block은 유일한 특수 대상이기 때문에 모두들 그의 특수성에 익숙해졌다.또한 앞에서 말한 바와 같이 창고 대상의 유효한 영역은 그 소재의 블록에만 한정되기 때문에 아래의 코드와 같이 원하는 결과를 출력할 수 없습니다.
    void (^block)();
    if(x)
    {
    block = ^{ printf("x
    "); }; } else { block = ^{ printf("not x
    "); }; } block();

    텍스트 링크:http://foggry.com/blog/2017/02/06/wei-shi-yao-objective-c-dui-xiang-cun-chu-zai-dui-shang-er-bu-shi-zhan-shang/

    좋은 웹페이지 즐겨찾기