C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了通用Objective-C描述方法来打印ivar值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Objective-C中,通过打印对象ID和实例变量名称/值的方法来覆盖-description是很常见的.我想制作一个通用的描述方法,通过内省来做,而不是为每个类手动这样做.我希望输出如下:
<ClassName: 0x??????,ivar1: value1,ivar2: value2,ivar3: value3,...>
@H_489_4@对实例变量名进行排序也是很好的(所以它们总是按照相同的顺序排列).最后,如果这可以安全地覆盖NSObject功能,那将是完美的(但是我看到这并不简单,因为NSObject.m有一个关于在-description中使用 – [NSString StringWithFormat:]的警告).

解决方法

这是一个很好的问题!因为我没有找到这样的东西,我写了一个小功能,为你做这个.它使用方法swizzling替换(NSString *)NSObject的描述(是的,我是这个邪恶的MAHAHAHAHAHAHAHAHAHAHAHAHAHA),并按照它们也出现在类中的顺序打印出ivar(您可以轻松地编辑它们以字母顺序显示) . @H_489_4@别!忘了调用NSObjectSwizzleDescription()!

@H_489_4@.h文件

@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,请注明来意。