문제

카테고리에서 ivar와 유사한 동작을 호출하기 위해 연관 참조를 사용할 수 있다는 것을 이해합니다.그런데 카테고리에서 새로운 ivar를 선언할 수 없는 구체적인 이유는 무엇입니까?

수업의 사적인 공간을 침범할 것이기 때문일까요?아니면 다른 이유가 있나요?그렇다면, 무엇이든 깨뜨릴 수 있는 범주에서 ivar를 선언하는 기능을 보여주는 예를 들어보겠습니다.

도움이 되었습니까?

해결책

Objective-C의 ivar를 평범한 오래된 C 구조처럼 생각하십시오.클래스의 인스턴스를 인스턴스화하면 해당 구조를 보유할 수 있을 만큼 큰 메모리 블록이 생성됩니다.

당신이 가지고 있다고 가정 해 봅시다 NSString.수많은 기존 코드가 컴파일되어 사용됩니다. NSString.이 코드의 대부분은 라이브러리와 프레임워크에 내장되어 있습니다.해당 컴파일된 코드는 ivar가 NSString X 바이트 수를 취하고 해당 메모리 내의 특정 오프셋에 있습니다.

이제 여러분의 작은 프로젝트에서 카테고리를 생성한다고 가정해 보겠습니다. NSString ivar를 추가하고 싶습니다.이론적으로 해당 범주에 대한 헤더 파일을 포함하는 프로젝트의 모든 코드는 이 "새" 헤더 파일의 크기를 알 것입니다. NSString (+ 카테고리)는 X + Y 바이트를 사용합니다.이는 하위 클래스와 매우 유사합니다.새로 컴파일된 이 코드는 추가 ivar를 적절하게 처리할 수 있습니다.

그러나 사전 컴파일된 모든 코드, 라이브러리 및 프레임워크는 추가 ivar에 대한 지식이 없습니다.언제 NSString 인스턴스가 생성되면 메모리는 X + Y 바이트가 아닌 X 바이트입니다.앱 코드가 더 작은 메모리 덩어리에 대한 참조를 얻고 ivar 카테고리의 바이트에 액세스하려고 시도하면 혼란이 발생합니다.상황이 호황을 누리게 될 것입니다.

평범하고 오래된 하위 클래스를 사용하면 하위 클래스의 ivar를 사용할 수 있는 모든 코드가 하위 클래스의 ivar에 대해 알고 있기 때문에 문제가 없습니다.그러나 카테고리를 사용하면 기존 코드는 추가 사항에 대한 지식이 없으며 이를 위한 공간을 제대로 생성하지 못합니다.

나는 위의 모든 내용이 대부분 경험에 근거한 추측임을 명시해야 한다고 생각합니다.나는 완전히 틀렸을 수도 있습니다.적어도 합리적인 것 같습니다.:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top