2011-10-29 3 views
4

Objective-C Runtime provides the class_addIvar C function : 나는 sizealignment을 위해 배치해야합니까 무엇Objective-C 런타임 : class_addIvar의 크기 및 정렬을 위해 넣어야 할 사항은 무엇입니까?

BOOL class_addIvar(Class cls, const char *name, size_t size, 
        uint8_t alignment, const char *types) 

?

UITextPosition * 유형의 인스턴스 변수를 추가했지만 UITextPosition 오브젝트가 범위에 없습니다. size의 경우 sizeof(self)을 입력하면됩니다. selfUITextField의 하위 클래스입니까? 즉, UITextPosition 개체가 UITextField 개체와 같은 크기라고 가정 할 수 있습니까?

alignment은 어떻게받을 수 있습니까?

답변

4

우선, 큰 질문은 '이유'입니다. 이것은 런타임에 직접 생성하는 클래스에서만 작동하며, 기존 클래스에 ivars를 추가 할 수 없습니다.

그런 상황에서, 포인터 유형 인 ivar를 추가하고 있습니다. 즉, 모두 동일한 크기입니다. 그것의 포인터의 크기가 아니라 개체의 크기가 중요합니다. log2(sizeof(UITextPosition*))

+0

감사합니다, 그래, 난 그냥 UITextInput' 정확히 인'beginningOfDocument'의 바르를 가지고'눈치 때문에 실제로 어쨌든 바르를 추가하지 않았다 실현 내가 원한거야. 그래서, 나는 그것을 사용할 것이다. 그러나, 이것은 알고있는 것이 좋습니다. 감사! 나는 당신이 '크기'를 어떻게 생각해 냈는지 이해하지만, 어떻게'정렬 '을 생각해 냈습니까? 크기가 log2 인 이유는 무엇입니까? – ma11hew28

+0

'class_addIvar'가'1 << align'을하기 때문에 log2입니다. 이것은'pow (2, align)'와 같습니다. ['class_addIvar' 매뉴얼 (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/class_addIvar)을보십시오. –

7

이 물건의 문서는 당신이 그것을 사용하지 않아야 일반적으로 그 사항을 반영 않는, 매우 유익하지 않다 당신이 다음에 링크 된 문서에서

, 당신은 sizeof(UITextPosition*) 같은 크기와 정렬을 할 수 있습니다. 그러나 정렬을 요청할 수 있습니다 :

char *texPosEncoding = @encode(UITextPosition); 
NSUInteger textPosSize, textPosAlign; 
NSGetSizeAndAlignment(textPosEncoding, &textPosSize, &textPosAlign); 
class_addIvar(yourClass, "yourIvarName", textPosSize, textPosAlign, textPosEncoding); 
+0

참조되는 정렬은 UI 정렬이 아닌 ivar의 데이터 구조 정렬입니다. 완전히 다른 것들이 있으므로이 코드는 상당히 잘못되었습니다. https://en.wikipedia.org/wiki/Data_structure_alignment – rpj

+0

여기의 코드는 'UITextPosition' 객체에 대한 ivar 참조를위한 데이터 구조 정렬을 참조합니다. 여기에는 UI 정렬이 없습니다. –