大佬教程收集整理的这篇文章主要介绍了通用Objective-C描述方法来打印ivar值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<ClassName: 0x??????,ivar1: value1,ivar2: value2,ivar3: value3,...>@H_489_4@对实例变量名进行排序也是很好的(所以它们总是按照相同的顺序排列).最后,如果这可以安全地覆盖NSObject功能,那将是完美的(但是我看到这并不简单,因为NSObject.m有一个关于在-description中使用 – [NSString StringWithFormat:]的警告).
@interface NSObject (JSObjectAdditions) @end void NSObjectSwizzleDescription();@H_489_4@.m文件:
#import <objc/objc.h> #import "JSObject.h" @implementation NSObject (JSObjectAdditions) - (NSString *)verboseDescription { NSMutableString *description = [NSMutableString StringWithFormat:@"<%@: %p>",NSStringFromClass([self class]),self]; uint32_t ivarCount; Ivar *ivars = class_copyIvarList([self class],&ivarCount); if(ivars) { [description appendString:@"\n{"]; for(uint32_t i=0; i<ivarCount; i++) { Ivar ivar = ivars[i]; const char *ivarType = ivar_getTypeEncoding(ivar); id ivarObject = object_getIvar(self,ivar); [description appendFormat:@"\n %s: ",ivar_getName(ivar)]; // Default signed data types if(strcmp(ivarType,"c") == 0) { char character = (char)ivarObject; [description appendFormat:@"'%c'",character]; } else if(strcmp(ivarType,"i") == 0 || strcmp(ivarType,"l") == 0) // l is also 32 bit in the 64 bit runtime environment { int Integer = (int)ivarObject; [description appendFormat:@"%i",Integer]; } else if(strcmp(ivarType,"s") == 0) { short shortVal = (short)ivarObject; [description appendFormat:@"%i",(int)shortVal]; } else if(strcmp(ivarType,"q") == 0) { long long longVal = (long long)ivarObject; [description appendFormat:@"%l",longVal]; } // Default unsigned data types else if(strcmp(ivarType,"C") == 0) { unsigned char chracter = (unsigned char)ivarObject; [description appendFormat:@"'%c'",chracter]; } else if(strcmp(ivarType,"I") == 0 || strcmp(ivarType,"L") == 0) { unsigned int Integer = (unsigned int)ivarObject; [description appendFormat:@"%u","S") == 0) { unsigned short shortVal = (unsigned short)ivarObject; [description appendFormat:@"%i","Q") == 0) { unsigned long long longVal = (unsigned long long)ivarObject; [description appendFormat:@"%ll",longVal]; } // Floats'n'stuff else if(strcmp(ivarType,"f") == 0) { float floatVal; memcpy(&floatVal,&ivarObject,sizeof(float)); [description appendFormat:@"%f",floatVal]; } else if(strcmp(ivarType,"d") == 0) { double doubleVal; memcpy(&doubleVal,sizeof(doublE)); [description appendFormat:@"%f",doubleVal]; } // Boolean and pointer else if(strcmp(ivarType,"B") == 0) { BOOL BooleanVal = (BOOL)ivarObject; [description appendFormat:@"%@",(BooleanVal ? @"YES" : @"NO")]; } else if(strcmp(ivarType,"v") == 0) { void *pointer = (void *)ivarObject; [description appendFormat:@"%p",pointer]; } else if(strcmp(ivarType,"*") == 0 || strcmp(ivarType,":") == 0) // SEL is just a typecast for a cString { char *cString = (char *)ivarObject; [description appendFormat:@"\"%s\"",cString]; } else if(strncmp(ivarType,"@",1) == 0) { [description appendFormat:@"%@",ivarObject]; } else if(strcmp(ivarType,"#") == 0) { Class objcClass = (Class)ivarObject; [description appendFormat:@"%s",class_getName(objcClass)]; } else [description appendString:@"???"]; } [description appendString:@"\n}"]; free(ivars); } return description; } @end void NSObjectSwizzleDescription() { Method origMethod = class_geTinstanceMethod([NSObject class],@SELEctor(description)); Method newMethod = class_geTinstanceMethod([NSObject class],@SELEctor(verboseDescription)); method_exchangeImplementations(origMethod,newMethod); }
以上是大佬教程为你收集整理的通用Objective-C描述方法来打印ivar值全部内容,希望文章能够帮你解决通用Objective-C描述方法来打印ivar值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。