cocoa의 고급 개발 런타임 초급 기본 변수
객체 복제본:
id object_copy(id obj, size_t size) //
id object_dispose(id obj)
TsetClass *obj = [TsetClassnew];
id objTest =object_copy(obj,sizeof(obj));
(lldb)po &obj 0x00007fff54a7cb08(lldb)po &objTest 0x00007fff54a7cb00 의심할 여지없이 인쇄한 메모리 주소는 같지 않습니다. 이 방법은 바늘의 깊은 복사와 유사합니다.
깊이 복사 및 얕은 복사
list:TestRuntime(1034,0x111b66300) malloc: * error for object 0x7ffe1a75b940: pointer being freed was not allocated
객체의 클래스 변경/객체 가져오기 클래스
TsetClass *obj1 = [TsetClass new];
Class aClass =object_setClass(obj1, [CustomClassOther class]);
(lldb)po obj1
<CustomClassOther: 0x7f8e4bd14480>
(lldb) po aClass
TsetClass
0.0.
TsetClass *obj2 = [TsetClass new];
Class aLogClass =object_getClass(obj2);
(lldb) po aLogClass
TsetClass
NSString *className = [NSStringstringWithCString:object_getClassName(obj2)encoding:NSUTF8StringEncoding];
NSLog(@"className:%@", className);
(lldb) po className
TsetClass
BOOL class_addMethod(Class cls,SEL name,IMP imp, const char *types)
TsetClass *instance = [[TsetClassalloc]init];
class_addMethod([TsetClass class],@selector(ocMethod:), (IMP)cfunction,"i@:@");
if ([instance respondsToSelector:@selector(ocMethod:)]) {
NSLog(@"Yes, instance respondsToSelector:@selector(ocMethod:)");
} else
{
NSLog(@"Sorry");
}
int a = (int)[instance ocMethod:@" OC method,C "];
NSLog(@"a:%d", a);
int cfunction(id self, SEL _cmd, NSString *str) {
NSLog(@"%@", str);
return 520;//
}
u_int count;
Method* methods= class_copyMethodList([UIViewController class], &count);
for (int i = 0; i < count ; i++) { SEL name = method_getName(methods[i]); NSString *strName = [NSString stringWithCString:sel_getName(name)encoding:NSUTF8StringEncoding]; // NSLog(@"%@",strName); }
하나의 클래스의 모든 속성 가져오기
u_int count;
objc_property_t *properties=class_copyPropertyList([TsetClass class], &count);
for (int i = 0; i < count ; i++) {
const char* propertyName =property_getName(properties[i]);
NSString *strName = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];
NSLog(@"%@",strName);
}
float myFloatValue;
object_getInstanceVariable(self,"myFloat"(void*)&myFloatValue);
NSLog(@"%f", myFloatValue);
float newValue = 10.00f;
unsigned int addr = (unsigned int)&newValue;
object_setInstanceVariable(self,"myFloat", *(float**)addr);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.