• 注意: 文中的OC对象指Objective-C对象,CF对象指Core Foundation中的对象

  • 转换方法:
    (__bridge type)expression
    (__bridge_retained CF type)expression
    (__bridge_transfer Objective-C type)expression

一. OC对象与CF对象的相互转换

1. OC对象转CF对象

- (void)OFConvertOC {
    CFStringRef stringCF = (CFStringRef)@"OF对象 --> OC对象";
    NSString *stringOC1 = (__bridge NSString *)stringCF; // 方式一
    NSString *stringOC2 = (__bridge_transfer NSString *)stringCF; // 方式二
    NSLog(@"%@", stringOC1);
    NSLog(@"%@", stringOC2);

2. OF对象转OC对象

- (void)OCConvertCF {
    NSString *stringOC = @"OC对象 --> CF对象";
    CFStringRef stringCF1 = (__bridge CFStringRef)stringOC; // 方式一
    CFStringRef stringCF2 = (__bridge_retained CFStringRef)stringOC; // 方式二,但stringCF2引用计数会加1
    NSLog(@"%@", stringCF1);
    NSLog(@"%@", stringCF2);

二. ARC下查看OC对象的引用计数

- (void)seeRetainCountFromARC {
    NSObject *objOC = [[NSObject alloc] init];
    CFTypeRef objCF = (__bridge CFTypeRef)objOC;
    // 最初的引用计数
//    NSInteger retainCount = CFGetRetainCount(objCF);
    // 这里可以不用以__bridge前缀转换,但是如果拆开就得加上__bridge
    NSInteger retainCount = CFGetRetainCount((CFTypeRef)objOC);
    NSLog(@"最初 --- 引用计数 --- %ld", retainCount);
    // 引用计数加1
    CFRetain(objCF);
    NSLog(@"retain --- 引用计数 --- %ld", CFGetRetainCount(objCF));
    // 引用计数减1
    CFRelease(objCF);
    NSLog(@"release --- 引用计数 --- %ld", CFGetRetainCount(objCF));
    // 使用__bridge_retained为前缀转换,引用计数会加1
    objCF = (__bridge_retained CFTypeRef)objOC;
    NSLog(@"__bridge_retained --- 引用计数 --- %ld", CFGetRetainCount(objCF));
    // 当把objOC设为nil,在ARC下引用计数为0,系统会自动销毁objOC对象
    objOC = nil;
                    注意:文中的OC对象指Objective-C对象,CF对象指Core Foundation中的对象  转换方法:   (__bridge type)expression   (__bridge_retained CF type)expression   (__bridge_transfer Objective-C type)expression
				
一、引用计数   引用计数是Objetive-C语言的内存管理机制,用于管理OC对象(通常指包含isa指针的结构体)的内存。     一个对象引用计数为大于0的计数,表示这个对象被持有,不能被释放,当引用计数为0时表示这个对象需要被释放掉。   改变引用计数的方法有,retain、release、alloc、autorelease、reatinautorelease、copy、multicop...
1.__bridge:CFOC对象转化时只涉及对象类型不涉及对象所有权的转化2.__bridge_transfer:常用在讲CF对象转换OC对象时,将CF对象的所有权交给OC对象,此时ARC就能自动管理该内存;(作用同CFBridgingRelease()) 3.__bridge_retained:(与__bridge_transfer相反)常用在将OC对象转换CF对象时,将OC对象的所有权交给CF对象来管理
### 回答1: tim_oc1init和tim_oc2init是STM32的定时器模块中的函数,用于初始化定时器的输出比较通道1和通道2。其中,tim_oc1init用于初始化通道1,tim_oc2init用于初始化通道2。这两个函数可以设置定时器的输出模式、极性、预分频器等参数,以满足不同的应用需求。 ### 回答2: tim_oc1init和tim_oc2init是两个函数,是在STM32开发中使用的定时器输出比较功能函数。 首先,我们需要了解一下定时器和定时器输出比较的概念。定时器是一种可编程、周期性的计时器,它能够在一定时间内产生定时中断或输出PWM信号。而定时器输出比较是指定时器对比较值进行比较,当定时器计数计数值达到比较值时,定时器输出会发生变化。 tim_oc1init和tim_oc2init是用于设定定时器输出比较功能的函数,以tim_oc1init函数为例,它的具体功能包括: 1. 设定TIMx_CH1的输出模式和极性,可以选择PWM模式或脉冲模式,并可设定输出极性为正常或反转; 2. 设定比较值,即当计数器的值达到此值时触发输出; 3. 设定预分频系数和重载值,确定计时器的计数范围。 通过tim_oc1init和tim_oc2init函数的设定,可以实现定时器输出比较功能,可以控制各种电子设备的输出信号和开关控制,适用于各种行业的应用场景。在开发中,根据具体需求使用不同的输出模式和比较值,可以实现多种不同的功能操作。 ### 回答3: tim_oc1init和tim_oc2init是针对定时器的两个初始化函数。 首先,定时器是嵌入式系统中非常重要的一个模块,它可以通过计时和计数等方式实现各种定时和计时功能,比如控制LED灯闪烁、通过定时触发中断来完成一些任务等。 而tim_oc1init和tim_oc2init则是针对定时器的输出比较功能而设置的两个初始化函数,用于配置定时器的输出比较通道1和通道2。 对于tim_oc1init而言,它可以设置如下几个参数:定时器的指针、比较输出模式、预分频系数、占空比等。其中,比较输出模式有四种模式可供选择,分别为TIM_OCMode_Timing(定时模式)、TIM_OCMode_Active(有效电平模式)、TIM_OCMode_Inactive(无效电平模式)和TIM_OCMode_PWM1(脉冲宽度调制模式)。 而tim_oc2init则是针对定时器的输出比较通道2进行初始化,可以设置的参数与tim_oc1init相同,只不过它是控制通道2的输出状态。 需要注意的是,这两个函数都是基于STM32的定时器模块设计的,因此在使用它们时需要根据硬件平台来确定具体的实现方法和参数设置。 总的来说,tim_oc1init和tim_oc2init是非常重要的定时器初始化函数,可以方便地控制定时器的输出比较通道,从而实现各种自定义的功能。
SSIrreplaceable: NSClassFromString()返回的是类型,当时写错了。应该是 Class strClass = NSClassFromString(@"AppDelegate"); 下列代码,运行结果是同类型。 [code=objc] int main(int argc, char * argv[]) { @autoreleasepool { Class strClass = NSClassFromString(@"AppDelegate"); if ([AppDelegate isSubclassOfClass:strClass]) NSLog(@"同类型"); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); [/code] iOS的常见文件及程序的启动原理 zhuanshazhuyao: AppDelegate *strClass = NSClassFromString(@"AppDelegate"); 这句类型都不对。。