RunTime

C++异常处理 std::runtime_error 使用详解 异常是程序在执行过程中发生的异常情况,通常是由于错误或意外条件导致的。C++ 提供了异常处理机制,允许程序在发生错误时优雅地处理问题,而不是直接崩溃。是定义在头文件中的一个异常类,用于表示运行时错误。它是的子类,因此可以使用的接口(如what())来获取错误信息。类定义public:可以通过继承来创建自定义的运行时异常类,以便更好地表示特定的错误类型。public:// 模拟文件打开失败try {return 0;输出结果是 C++ 中用于表示运行时错误的标准异常类。 阅读详情

前言

runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的,并且最后两个demo也是MJExtension的实现原理,面试的时候也可以多扯点。
另外runtime的知识还有很多,想要了解更多可以看我翻译的官方文档(有点枯燥),本文的demo下载地址

什么是runtime?

runtime 是 OC底层的一套C语言的API(引入 <objc/runtime.h> 或<objc/message.h>),编译器最终都会将OC代码转化为运行时代码,通过终端命令编译.m 文件:clang -rewrite-objc xxx.m可以看到编译后的xxx.cpp(C++文件)。
比如我们创建了一个对象 [[NSObject alloc]init],最终被转换为几万行代码,截取最关键的一句可以看到底层是通过runtime创建的对象


.cpp 文件

删除掉一些强制转换语句,可以看到调用方法本质就是发消息,[[NSObject alloc]init]语句发了两次消息,第一次发了alloc 消息,第二次发送init 消息。利用这个功能我们可以探究底层,比如block的实现原理。
需要注意的是,使用objc_msgSend()  sel_registerName()方法需要导入头文件<objc/message.h>


消息机制

另外利用runtime 可以做一些OC不容易实现的功能

  • 动态交换两个方法的实现(特别是交换系统自带的方法)
  • 动态添加对象的成员变量和成员方法
  • 获得某个类的所有成员方法、所有成员变量

如何应用运行时?

1.将某些OC代码转为运行时代码,探究底层,比如block的实现原理(上边已讲到);
2.拦截系统自带的方法调用(Swizzle 黑魔法),比如拦截imageNamed:、viewDidLoad、alloc;
3.实现分类也可以增加属性;
4.实现NSCoding的自动归档和自动解档;
5.实现字典和模型的自动转换。

下面我通过demo 我一个个来讲解

一、交换两个方法的实现,拦截系统自带的方法调用功能

需要用到的方法 <objc/runtime.h>

  • 获得某个类的类方法
    Method class_getClassMethod(Class cls , SEL name)
  • 获得某个类的实例对象方法
    Method class_getInstanceMethod(Class cls , SEL name)
  • 交换两个方法的实现
    void method_exchangeImplementations(Method m1 , Method m2)
案例1:方法简单的交换

创建一个Person类,类中实现以下两个类方法,并在.h 文件中声明

+ (void)run {
    NSLog(@"跑");
}

+ (void)study {
    NSLog(@"学习");
}

控制器中调用,则先打印跑,后打印学习

[Person run];
[Person study];

下面通过runtime 实现方法交换,类方法用class_getClassMethod ,对象方法用class_getInstanceMethod

// 获取两个类的类方法
Method m1 = class_getClassMethod([Person class], @selector(run));
Method m2 = class_getClassMethod([Person class], @selector(study));
// 开始交换方法实现
method_exchangeImplementations(m1, m2);
// 交换后,先打印学习,再打印跑!
[Person run];
[Person study];
案例2:拦截系统方法

需求:比如iOS6 升级 iOS7 后需要版本适配,根据不同系统使用不同样式图片(拟物化和扁平化),如何通过不去手动一个个修改每个UIImage的imageNamed:方法就可以实现为该方法中加入版本判断语句?

步骤:
1、为UIImage建一个分类(UIImage+Category)
2、在分类中实现一个自定义方法,方法中写要在系统方法中加入的语句,比如版本判断

+ (UIImage *)xh_imageNamed:(NSString *)name {
    double version = [[UIDevice currentDevice].systemVersion doubleValue];
    if (version >= 7.0) {
        // 如果系统版本是7.0以上,使用另外一套文件名结尾是‘_os7’的扁平化图片
        name = [name stringByAppendingString:@"_os7"];
    }
    return [UIImage xh_imageNamed:name];
}

3、分类中重写UIImage的load方法,实现方法的交换(只要能让其执行一次方法交换语句,load再合适不过了)

+ (void)load {
    // 获取两个类的类方法
    Method m1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method m2 = class_getClassMethod([UIImage class], @selector(xh_imageNamed:));
    // 开始交换方法实现
    method_exchangeImplementations(m1, m2);
}
注意:自定义方法中最后一定要再调用一下系统的方法,让其有加载图片的功能,但是由于方法交换,系统的方法名已经变成了我们自定义的方法名(有点绕,就是用我们的名字能调用系统的方法,用系统的名字能调用我们的方法),这就实现了系统方法的拦截!

利用以上思路,我们还可以给 NSObject 添加分类,统计创建了多少个对象,给控制器添加分类,统计有创建了多少个控制器,特别是公司需求总变的时候,在一些原有控件或模块上添加一个功能,建议使用该方法!

二、在分类中设置属性,给任何一个对象设置属性

众所周知,分类中是无法设置属性的,如果在分类的声明中写@property 只能为其生成get 和 set 方法的声明,但无法生成成员变量,就是虽然点语法能调用出来,但程序执行后会crash,有人会想到使用全局变量呢?比如这样:

int _age;

- (int )age {
    return _age;
}

- (void)setAge:(int)age {
    _age = age;
}

但是全局变量程序整个执行过程中内存中只有一份,我们创建多个对象修改其属性值都会修改同一个变量,这样就无法保证像属性一样每个对象都拥有其自己的属性值。这时我们就需要借助runtime为分类增加属性的功能了。

需要用到的方法 <objc/runtime.h>

  • set方法,将值value 跟对象object 关联起来(将值value 存储到对象object 中)
    参数 object:给哪个对象设置属性
    参数 key:一个属性对应一个Key,将来可以通过key取出这个存储的值,key 可以是任何类型:double、int 等,建议用char 可以节省字节
    参数 value:给属性设置的值
    参数policy:存储策略 (assign 、copy 、 retain就是strong)
    void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy)
  • 利用参数key 将对象object中存储的对应值取出来
    id objc_getAssociatedObject(id object , const void *key)

步骤:
1、创建一个分类,比如给任何一个对象都添加一个name属性,就是NSObject添加分类(NSObject+Category)
2、先在.h 中@property 声明出get 和 set 方法,方便点语法调用

@property(nonatomic,copy)NSString *name;

3、在.m 中重写set 和 get 方法,内部利用runtime 给属性赋值和取值

char nameKey;

- (void)setName:(NSString *)name {
    // 将某个值跟某个对象关联起来,将某个值存储到某个对象中
    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, &nameKey);
}
三、获得一个类的所有成员变量

最典型的用法就是一个对象在归档和解档的 encodeWithCoder和initWithCoder:方法中需要该对象所有的属性进行decodeObjectForKey: 和 encodeObject:,通过runtime我们声明中无论写多少个属性,都不需要再修改实现中的代码了。

需要用到的方法 <objc/runtime.h>

  • 获得某个类的所有成员变量(outCount 会返回成员变量的总数)
    参数:
    1、哪个类
    2、放一个接收值的地址,用来存放属性的个数
    3、返回值:存放所有获取到的属性,通过下面两个方法可以调出名字和类型
    Ivar *class_copyIvarList(Class cls , unsigned int *outCount)
  • 获得成员变量的名字
    const char *ivar_getName(Ivar v)
  • 获得成员变量的类型
    const char *ivar_getTypeEndcoding(Ivar v)
案例1:获取Person类中所有成员变量的名字和类型
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList([Person class], &outCount);

// 遍历所有成员变量
for (int i = 0; i < outCount; i++) {
    // 取出i位置对应的成员变量
    Ivar ivar = ivars[i];
    const char *name = ivar_getName(ivar);
    const char *type = ivar_getTypeEncoding(ivar);
    NSLog(@"成员变量名:%s 成员变量类型:%s",name,type);
}
// 注意释放内存!
free(ivars);
案例2:利用runtime 获取所有属性来重写归档解档方法
// 设置不需要归解档的属性
- (NSArray *)ignoredNames {
    return @[@"_aaa",@"_bbb",@"_ccc"];
}

// 解档方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        // 获取所有成员变量
        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList([self class], &outCount);

        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            // 将每个成员变量名转换为NSString对象类型
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            // 忽略不需要解档的属性
            if ([[self ignoredNames] containsObject:key]) {
                continue;
            }

            // 根据变量名解档取值,无论是什么类型
            id value = [aDecoder decodeObjectForKey:key];
            // 取出的值再设置给属性
            [self setValue:value forKey:key];
            // 这两步就相当于以前的 self.age = [aDecoder decodeObjectForKey:@"_age"];
        }
        free(ivars);
    }
    return self;
}

// 归档调用方法
- (void)encodeWithCoder:(NSCoder *)aCoder {
     // 获取所有成员变量
    unsigned int outCount = 0;
    Ivar *ivars = class_copyIvarList([self class], &outCount);
    for (int i = 0; i < outCount; i++) {
        Ivar ivar = ivars[i];
        // 将每个成员变量名转换为NSString对象类型
        NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

        // 忽略不需要归档的属性
        if ([[self ignoredNames] containsObject:key]) {
            continue;
        }

        // 通过成员变量名,取出成员变量的值
        id value = [self valueForKeyPath:key];
        // 再将值归档
        [aCoder encodeObject:value forKey:key];
        // 这两步就相当于 [aCoder encodeObject:@(self.age) forKey:@"_age"];
    }
    free(ivars);
}

依据上面的原理我们就可以给NSObject做一个分类,让我们不需要每次都写这么一长串代码,只要实现一小段代码就可以让一个对象具有归解档的能力。

注意,下面的代码我换了一个方法名(不然会覆盖系统原来的方法!),加了一个忽略属性方法是否被实现的判断,并加上了对父类属性的归解档循环。

NSObject+Extension.h

#import <Foundation/Foundation.h>

@interface NSObject (Extension)

- (NSArray *)ignoredNames;
- (void)encode:(NSCoder *)aCoder;
- (void)decode:(NSCoder *)aDecoder;

@end

NSObject+Extension.m

#import "NSObject+Extension.h"
#import <objc/runtime.h>

@implementation NSObject (Extension)

- (void)decode:(NSCoder *)aDecoder {
    // 一层层父类往上查找,对父类的属性执行归解档方法
    Class c = self.class;
    while (c &&c != [NSObject class]) {

        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList(c, &outCount);
        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            // 如果有实现该方法再去调用
            if ([self respondsToSelector:@selector(ignoredNames)]) {
                if ([[self ignoredNames] containsObject:key]) continue;
            }

            id value = [aDecoder decodeObjectForKey:key];
            [self setValue:value forKey:key];
        }
        free(ivars);
        c = [c superclass];
    }

}

- (void)encode:(NSCoder *)aCoder {
    // 一层层父类往上查找,对父类的属性执行归解档方法
    Class c = self.class;
    while (c &&c != [NSObject class]) {

        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList([self class], &outCount);
        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            // 如果有实现该方法再去调用
            if ([self respondsToSelector:@selector(ignoredNames)]) {
                if ([[self ignoredNames] containsObject:key]) continue;
            }

            id value = [self valueForKeyPath:key];
            [aCoder encodeObject:value forKey:key];
        }
        free(ivars);
        c = [c superclass];
    }
}
@end

上面分类使用方法:在需要归解档的对象中实现下面方法即可:

// 设置需要忽略的属性
- (NSArray *)ignoredNames {
    return @[@"bone"];
}

// 在系统方法内来调用我们的方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        [self decode:aDecoder];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [self encode:aCoder];
}

这样看来,我们每次又要写同样的代码,我们可以将归解档两个方法封装为宏,在需要的地方一句宏搞定,如果有不需要归解档的属性就实现ignoredNames 方法,具体可以看我的demo,这个也是MJExtension中那个一句宏就可以解决归解档的实现原理。

案例3:利用runtime 获取所有属性来进行字典转模型

以往我们都是利用KVC进行字典转模型,但是它还是有一定的局限性,例如:模型属性和键值对对应不上会crash(虽然可以重写setValue:forUndefinedKey:方法防止报错),模型属性是一个对象或者数组时不好处理等问题,所以无论是效率还是功能上,利用runtime进行字典转模型都是比较好的选择。

字典转模型我们需要考虑三种特殊情况:
1.当字典的key和模型的属性匹配不上
2.模型中嵌套模型(模型属性是另外一个模型对象)
3.数组中装着模型(模型的属性是一个数组,数组中是一个个模型对象)

根据上面的三种特殊情况,我们一个个处理,先是字典的key和模型的属性不对应的情况。
不对应有两种,一种是字典的键值大于模型属性数量,这时候我们不需要任何处理,因为runtime是先遍历模型所有属性,再去字典中根据属性名找对应值进行赋值,多余的键值对也当然不会去看了;另外一种是模型属性数量大于字典的键值对,这时候由于属性没有对应值会被赋值为nil,就会导致crash,我们只需加一个判断即可,JSON数据和sample如下:


JSON数据
- (void)setDict:(NSDictionary *)dict {

    Class c = self.class;
    while (c &&c != [NSObject class]) {

        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList(c, &outCount);
        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            // 成员变量名转为属性名(去掉下划线 _ )
            key = [key substringFromIndex:1];
            // 取出字典的值
            id value = dict[key];

            // 如果模型属性数量大于字典键值对数理,模型属性会被赋值为nil而报错
            if (value == nil) continue;

            // 将字典中的值设置到模型上
            [self setValue:value forKeyPath:key];
        }
        free(ivars);
        c = [c superclass];
    }
}

第二种情况是模型的属性是另外一个模型对象


JSON数据

这时候我们就需要利用runtime的ivar_getTypeEncoding 方法获取模型对象类型,对该模型对象类型再进行字典转模型,也就是进行递归,需要注意的是我们要排除系统的对象类型,例如NSString,下面的方法中我添加了一个类方法方便递归。


打印可以看到各属性类型
#import "NSObject+JSONExtension.h"
#import <objc/runtime.h>

@implementation NSObject (JSONExtension)

- (void)setDict:(NSDictionary *)dict {

    Class c = self.class;
    while (c &&c != [NSObject class]) {

        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList(c, &outCount);
        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            // 成员变量名转为属性名(去掉下划线 _ )
            key = [key substringFromIndex:1];
            // 取出字典的值
            id value = dict[key];

            // 如果模型属性数量大于字典键值对数理,模型属性会被赋值为nil而报错
            if (value == nil) continue;

            // 获得成员变量的类型
            NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];

            // 如果属性是对象类型
            NSRange range = [type rangeOfString:@"@"];
            if (range.location != NSNotFound) {
                // 那么截取对象的名字(比如@"Dog",截取为Dog)
                type = [type substringWithRange:NSMakeRange(2, type.length - 3)];
                // 排除系统的对象类型
                if (![type hasPrefix:@"NS"]) {
                    // 将对象名转换为对象的类型,将新的对象字典转模型(递归)
                    Class class = NSClassFromString(type);
                    value = [class objectWithDict:value];
                }
            }

            // 将字典中的值设置到模型上
            [self setValue:value forKeyPath:key];
        }
        free(ivars);
        c = [c superclass];
    }
}

+ (instancetype )objectWithDict:(NSDictionary *)dict {
    NSObject *obj = [[self alloc]init];
    [obj setDict:dict];
    return obj;
}

第三种情况是模型的属性是一个数组,数组中是一个个模型对象,例如下面的数据我就可以通过books[0].name获取到C语言程序设计


JSON数据

我们既然能获取到属性类型,那就可以拦截到模型的那个数组属性,进而对数组中每个模型遍历并字典转模型,但是我们不知道数组中的模型都是什么类型,我们可以声明一个方法,该方法目的不是让其调用,而是让其实现并返回模型的类型。
这块语言可能解释不太清楚,可以参考我的demo,直接运行即可。

NSObject+JSONExtension.h

// 返回数组中都是什么类型的模型对象
- (NSString *)arrayObjectClass ;

NSObject+JSONExtension.m

#import "NSObject+JSONExtension.h"
#import <objc/runtime.h>

@implementation NSObject (JSONExtension)

- (void)setDict:(NSDictionary *)dict {

    Class c = self.class;
    while (c &&c != [NSObject class]) {

        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList(c, &outCount);
        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            // 成员变量名转为属性名(去掉下划线 _ )
            key = [key substringFromIndex:1];
            // 取出字典的值
            id value = dict[key];

            // 如果模型属性数量大于字典键值对数理,模型属性会被赋值为nil而报错
            if (value == nil) continue;

            // 获得成员变量的类型
            NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];

            // 如果属性是对象类型
            NSRange range = [type rangeOfString:@"@"];
            if (range.location != NSNotFound) {
                // 那么截取对象的名字(比如@"Dog",截取为Dog)
                type = [type substringWithRange:NSMakeRange(2, type.length - 3)];
                // 排除系统的对象类型
                if (![type hasPrefix:@"NS"]) {
                    // 将对象名转换为对象的类型,将新的对象字典转模型(递归)
                    Class class = NSClassFromString(type);
                    value = [class objectWithDict:value];

                }else if ([type isEqualToString:@"NSArray"]) {

                    // 如果是数组类型,将数组中的每个模型进行字典转模型,先创建一个临时数组存放模型
                    NSArray *array = (NSArray *)value;
                    NSMutableArray *mArray = [NSMutableArray array];

                    // 获取到每个模型的类型
                    id class ;
                    if ([self respondsToSelector:@selector(arrayObjectClass)]) {

                        NSString *classStr = [self arrayObjectClass];
                        class = NSClassFromString(classStr);
                    }
                    // 将数组中的所有模型进行字典转模型
                    for (int i = 0; i < array.count; i++) {
                        [mArray addObject:[class objectWithDict:value[i]]];
                    }

                    value = mArray;
                }
            }

            // 将字典中的值设置到模型上
            [self setValue:value forKeyPath:key];
        }
        free(ivars);
        c = [c superclass];
    }
}

+ (instancetype )objectWithDict:(NSDictionary *)dict {
    NSObject *obj = [[self alloc]init];
    [obj setDict:dict];
    return obj;
}

@end
使用Runtime执行推理(C++) 使用Runtime执行推理(C++) 概述 通过MindSpore Lite模型转换后,需在Runtime中完成模型的推理执行流程。本教程介绍如何使用C++接口编写推理代码。 Runtime总体使用流程如下图所示: 包含的组件及功能如下所述: • Model:MindSpore Lite使用的模型,通过用户构图或直接加载网络,来实例化算子原型的列表。 • Lite Session:提供图编译的功能,并调用图执行器进行推理。 • Scheduler:算子异构调度器,根据异构调度策略,为每一个算子选择合适的k 阅读详情

相关推荐

OC中Runtime浅析

对Objective-C中Runtime的理解与使用

Minecraft 3734

C语言运行时库详解

<br />网址:http://blog.youkuaiyun.com/jxth152913/archive/2010/07/02/5708369.aspx<br />运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于新观念。所以这个时期的C运行时库都是单线程的。<br /><br />  随着操作系统 多线程技术的发展 ,最初的C运行时库无法满足程序的需求,出现了严重的问题 。C

GUANYIJUN123的专栏 1776

Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread

在runtime中有`和两个函数,这两个函数有什么作用呢?我们看一下标准库中对它们的解释。

rita_0567的博客 1191

Steamdeck 游戏提示c++ runtime错误

如果提示++错误,尝试将以上代码放到游戏的属性 启动项中。

www89574622的博客 4292

正确解决std::runtime_error异常的有效解决方法

正确解决std::runtime_error异常的有效解决方法

wbajsjhhhhh的博客 3922

复合材料RVE建模与力学性能分析实战指南

代表体积元(RVE)建模是复合材料多尺度分析的核心技术,通过建立微观结构与宏观性能的定量关联,可准确预测材料力学行为。本文基于ABAQUS平台,详细解析三材料(纤维/基体/界面相)RVE建模全流程,包括参数化几何建模、周期性网格划分策略、材料属性定义技巧等关键技术环节。针对碳纤维增强环氧树脂等典型复合材料,提供网格控制参数建议和材料参数参考表,并重点说明周期性边界条件的实现方法与验证标准。通过Python脚本自动化处理和优化分析流程,可显著提升计算效率,为复合材料设计提供可靠仿真依据。

weixin_34062469的博客 548

关于matlab runtime的配置,及runtime error

使用matlab的自.exe工具箱时,需要安装对应runtime,博主因为在配此环境时,看了配置runtime很多帖子写的乱七八糟,索性自己就写写一篇吧(亲测有效) 首先,去官网 下载对应版本的或者自己想要的runtime版本,不需要子版本一致(很多文章里都说要),但我没有按照他们的来也可以,没有那么苛刻. 博主这里是2020b,下载9.9的版本,但前后相差不大的版本也可(试过9.8的也行) 双击.exe文件 点下一步 选择matlab安装路径下的下图路径 ...

qq_55822954的博客 1万+

Codesys电子凸轮实战:从机械替代到虚轴设计的5个关键步骤

本文详细介绍了Codesys电子凸轮技术在运动控制领域的实战应用,从机械替代到虚轴设计的5个关键步骤。通过电子凸轮技术,操作员可以快速调整切割模式,显著提升产线效率。文章还探讨了虚轴架构、CAM表设计、动态耦合技巧及调试避坑指南,为工业自动化领域提供了实用的解决方案。

tech5的博客 767

@Retention(RetentionPolicy.RUNTIME)

注解按生命周期来划分可分为3类: 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃; 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在; 这3个生命周期分别对应于:Java源文件(.java文件) ---> .cla

诚的博客 2万+

RK3568-MIPI屏幕调试实战:LCD初始化时序解析与转换

本文详细解析RK3568平台MIPI屏幕调试中的LCD初始化时序,重点介绍DCS Write与Generic Write数据类型的转换方法,并提供厂家时序到RK格式的实战转换案例。通过理解上电初始化时序的重要性,帮助开发者快速解决屏幕不亮、花屏等常见调试问题,提升RK3568硬件开发效率。

d6e7f8g9h的博客 186

Windows/Linux双平台指南:3种方法快速释放被占用的GPU内存(含任务管理器替代方案)

本文详细介绍了在Windows和Linux双平台下快速释放被占用GPU内存的3种方法,包括任务管理器替代方案。从基础操作到高阶技巧,帮助用户彻底解决GPU内存驻留问题,提升计算资源利用率。特别适用于深度学习开发者和服务器管理员处理显存泄漏等常见问题。

j0k1l2m3n的博客 261

Runtime

iOS中的Runtime机制是OC和Swift的一种动态特性,它允许应用在运行时动态地创建类对象和实例对象,并通过消息传递和转发来实现方法的调用。

qq_74177011的博客 1304

华为2024机考真题集合

2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以 2,所得的结果就是中位数。在实际考试中会随机抽三道题目进行考察,其中两道100分卷题和一道200分卷题,总共400分。幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。3.查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。1.众数是指一组数据中出现次数量多的那个数,众数可以是多个。

qq_25360769的博客 5092

UEFI Runtime Drivers

UEFI Runtime Drivers UEFI runtime driver 是当OS 调用ExitBootServices 之后继续给OS 提供服务的驱动,UEFI Driver Writer Guide 也提到了一个比较好的UEFI runtime driver 是UNDI driver,其实写过网卡驱动的同学知道,在UEFI 环境一下我们只要提供SNP 驱动就可以了(参考VirtNet),提供UNDI 驱动是为了支持有的OS 启动的时候也可以直接调用UNDI 提供的接口去收发网络包。(感兴趣可以参

Pedroa的专栏 2612

变压器铁心100Hz振动噪声的COMSOL磁致伸缩仿真全流程

磁致伸缩是铁磁材料在磁场作用下发生尺寸变化的现象,也是变压器铁心振动与噪声产生的根本原因。由于应变与磁通密度近似成平方关系,50Hz电网激励下铁心振动基频为100Hz。借助COMSOL多物理场仿真,可将磁场计算结果映射为结构应力和变形,完成“电磁—结构”单向耦合分析。该技术广泛应用于变压器振动噪声预测、结构优化及故障诊断等工程场景。本文从磁致伸缩物理机理出发,系统梳理了材料参数、等效建模、边界条件设置和结果校核等关键步骤,帮助工程师掌握从磁致伸缩到结构变形的完整仿真链路,解决实际工程对标难题。

weixin_33796177的博客 312

避开这5个坑!Tushare数据获取与清洗的常见问题解决方案

本文详细解析了使用Tushare进行金融数据分析时常见的5大问题,包括Token失效、数据缺失、频率限制等,并提供了Python实战解决方案。通过智能填充策略、队列化管理和分层存储设计,帮助开发者高效获取和清洗金融数据,提升量化分析效率。特别适合金融数据分析师和Python开发者参考。

f9g0h的博客 418

ThinkPHP框架的runtime分析

未完待续。。。。

jar_java的专栏 1万+

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1715

Runtime工具类

Runtime类的方法没有用static修饰,所以需要获取对象,但是不能用一般JavaBean类创建对象的方式来获得Runtime类的对象,这是因为在Runtime类内部,它的空参构造方法被 private 修饰变成了私有的,外界无法访问。类的实例是全局唯一的,并且这个实例在 JVM 启动时就被创建,因此它提供了一种全局访问 JVM 运行时环境的方式。众所周知,JavaBean类是用来描述事物的类,而一台虚拟机只能有一个运行环境,因此,只能有一个描述该运行环境的对象,多个对象是不合逻辑的。

weixin_58722381的博客 1829

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Runtime pm

本文介绍了Linux内核中的RuntimePM(运行时电源管理)机制及其核心实现。主要内容包括:1. RuntimePM的核心机制基于设备引用计数,通过get/put操作控制设备状态转换;2. 详细阐述了runtime_idle/runtime_suspend/runtime_resume等状态转换过程;3. 分析了级联设备间的RuntimePM依赖关系;4. 分类介绍了同步和异步接口函数的功能及调用流程;5. 以pm_runtime_get_sync和pm_runtime_put_sync为例,说明从co

weixin_48117550的博客 1161

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Java】Runtime

表示的是当前虚拟机的运行环境,而在我们的电脑当中,一个电脑只能有一个运行环境,所以说如果你创建了多个对象,它是没有实际意义的,因此Java就规定了,在Java代码中运行的时候有一个小细节,方法的下面有一个红色波浪线,其实是给了你一个提示:你调用这个方法有可能会出现一些问题,那么我该如何解决呢?上面的方法都是获取到运行对象里面的一些参数,在以后如果我们需要通过Java代码去监控虚拟机的内存,那么上面这几个方法就可以用上了。​ 当你的好基友点击中间三个按钮的时候就在N秒之后关机,不同的按钮N的值不一样。

qq_39921135的博客 1880

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OpenMAIC:一堂 90 分钟从零生成的多智能体交互课堂,为什么能在全世界跑起来

OpenMAIC(Open Multi-Agent Interactive Classroom)是一个开源 AI 教育平台:给一个主题或一套教学材料,它就能一键生成多智能体交互课堂——AI 老师和 AI 同学会开口讲解、在白板上画图、和你实时讨论。今年 9 月 8 日,它在巴黎联合国教科文组织总部完成了一次现场演示;更早之前,它已收获 3.3 万 GitHub 星。本文用四个问题,拆开这套"中国

gitblog_00605的博客 805

runtime1/runtime:如何用这个革命性异步框架轻松构建高性能软件?

runtime1/runtime 是一个旨在让每个人都能轻松构建异步软件的革命性框架,它提供了直观的 API 和灵活的运行时选择,帮助开发者快速开发高性能的异步应用程序。 ## 🌟 什么是 runtime1/runtime? runtime1/runtime 是一个异步编程框架,它的设计理念是让异步 Rust 编程像标准库一样自然流畅。它提供了统一的异步 API,同时支持多种不同的运行时后端

gitblog_01133的博客 896

runtime-compiler和runtime-only的区别

本来是想写到漫漫学vue路系列的,但这个好像有点牵涉vue的底层知识了,所以单开一个博客。本文主要是看coderwhy(微博,b站搜索)老师的vue视频做的笔记。 用vue cli2创建项目时,往往会碰到让我们选择runtime-compiler模式还是runtime-only模式 默认选择的是runtime-compiler,因为runtime-compiler“更保险一点”。但是其实run...

qq_41706280的博客 2051

【iOS】Runtime

之前分part学习了Runtime的内容,但是没有系统的总结,这篇博客用来总结学过的所有Runtime知识Runtime又叫运行时,是一套底层的C语言API,是iOS系统的核心之一在编码阶段中,当我们向一个对象发送消息时,编译阶段只是确定了我们需要向接收者发送消息,但是接收者如何响应与处理这条消息是运行时决定的,我们来看一个例子#import // 基类 Animal@end} @end// Dog 类继承自 Animal@end");

weixin_72437555的博客 1537
上一篇: 数据存储方式IOS---归档与解档
下一篇: 使用CocoaPod出现-bash: pod: command not found 解决办法
网上的虫
博客等级 码龄11年 8粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值