当前位置: 首页 > news >正文

Apple - Core Foundation Design Concepts

本文翻译整理自:Core Foundation Design Concepts(更新日期:2013-12-16
https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFDesignConcepts/CFDesignConcepts.html#//apple_ref/doc/uid/10000122i


文章目录

  • 一、核心基础设计概念简介
    • 本文件的组织
  • 二、不透明类型
    • 不透明类型的优势
  • 三、对象引用
  • 四、多态函数
  • 五、物体的种类
  • 六、命名约定
  • 七、其他类型
  • 八、比较对象
  • 九、检查对象
  • 十、免费桥接类型
    • 强制转换和对象生命周期语义
    • 免费桥接类型


一、核心基础设计概念简介

Core Foundation是一个库,具有一组编程接口,这些接口在概念上源自基于Objective-C的Foundation框架,但用C语言实现。
为此,Core Foundation在C中实现了一个有限的对象模型。
Core Foundation定义了封装数据和函数的不透明类型,以下称为“对象”

Core Foundation对象的编程接口旨在易于使用和重用。
在一般层面上,Core Foundation:

  • 支持在各种框架和库之间共享代码和数据
  • 使某种程度的操作系统独立性成为可能
  • 支持Unicode字符串internationalization
  • 提供通用API和其他有用的功能,包括插件架构、XML属性列表和首选项

Core Foundation使OS X上的不同框架和库能够共享代码和数据。
应用程序、库和框架可以定义在其外部接口中包含Core Foundation类型的C例程;因此,它们可以通过这些接口相互通信数据——作为Core Foundation对象。

Core Foundation还在某些服务和Cocoa的Foundation框架之间提供“免费桥接”。
免费桥接使您能够在函数参数中将Cocoa对象替换为Core Foundation对象,反之亦然。

一些Core Foundation类型和函数是在不同操作系统上具有特定实现的事物的抽象。
因此,使用这些API的代码更容易移植到不同的平台。

日期和数字类型抽象了时间实用程序,并提供了在绝对时间度量和公历时间度量之间转换的工具。
它还抽象了数值,并提供了在这些值的不同内部表示之间转换的工具。

Core Foundation给应用程序开发带来的主要好处之一是internationalization支持。
通过其String对象,Core Foundation促进了所有OS X和Cocoa编程接口和实现的简单、健壮和一致的internationalization。
这种支持的基本部分是一种类型CFString,其实例表示16位Unicode字符的数组。
CFString对象足够灵活,可以容纳数兆字节的字符,但也足够简单和低级,可以用于所有通信字符数据的编程接口。
它的性能与标准C字符串没有太大区别。

您应该阅读本文档以了解核心基础的基本设计原则,以及核心基础对象如何与可可(触摸)对象交互。


本文件的组织

这些概念和任务讨论了Core Foundation中使用的对象模型:

  • 不透明类型
  • 对象引用
  • 多态函数
  • 物体的种类
  • 比较对象
  • 检查对象

此外,在使用Core Foundation之前,您应该熟悉其他非对象类型和API约定:

  • 命名约定
  • 其他类型
  • 免费桥接类型

二、不透明类型

Core Foundation支持封装和多态函数的对象模型基于不透明类型。

基于不透明类型的对象的各个字段对客户端是隐藏的,但是该类型的函数提供对这些字段的大多数值的访问。
图1描述了它“隐藏”的数据和呈现给客户端的界面中的不透明类型。

注意:“类”不用于指代不透明类型,因为尽管类和不透明类型在概念上相似,但许多人可能会觉得这个术语令人困惑。
然而,核心基金会留档经常将这些类型的特定数据承载实例称为“对象”


Core Foundation有许多不透明类型,这些类型的名称反映了它们的预期用途。
例如,CFString是一种不透明类型,它“表示”并对Unicode字符数组进行操作。
(“CF”当然是Core Foundation的前缀。)CFArray是基于索引的集合功能的不透明类型。
支持不透明类型的函数、常量和其他辅助数据类型通常定义在具有该类型名称的头文件中;例如,CFArray.h包含CFArray类型的符号定义。


图1 不透明类型

在这里插入图片描述


不透明类型的优势

对一些人来说,不透明类型似乎会通过阻止对结构内容的直接访问来施加不必要的限制。
似乎还有与不透明类型相关的开销,这可能会影响程序性能。
但是不透明类型的好处超过了这些看似的限制。

不透明类型为底层功能的实现方式提供了更好的抽象和更大的灵活性。
通过隐藏结构字段等细节,Core Foundation减少了当这些细节更改时客户端代码中可能发生错误的机会。
此外,不透明类型允许优化,如果暴露,可能会令人困惑。
例如,CFString “正式”表示UniChar类型的16位字符数组。
然而,CFString可能会选择将ASCII范围内的一系列字符存储为8位值。
复制不可变对象可能(并且通常会)导致对该对象的共享引用,而不是内存中的两个独立对象(参见 Core Foundation的内存管理编程指南 )。

继续以CFString为例,使用不透明类型来存储字符似乎是重量级的。
然而,事实证明,这种存储的CPU成本并不比使用简单的C字符数组高多少,而且内存成本通常更低。
此外,不透明并不一定意味着不透明类型永远不能提供直接访问内容的机制。
例如,CFString为此提供了CFStringGetCStringPtr功能。

最后,您可以在某种程度上自定义一些不透明的类型。
例如,集合类型允许您定义回调以在集合的每个成员上调用函数。


三、对象引用

您可以通过引用引用Core Foundation对象(不透明类型)。
在不透明类型的每个头文件中,您会注意到一两行类似于以下内容:

typedef const struct __CFArray * CFArrayRef;
typedef struct __CFArray * CFMutableArrayRef;

诸如此类的声明是对定义不透明类型的(私有)结构的不可变和可变版本的指针引用。
许多Core Foundation函数的参数和返回值采用这些对象引用的类型,而不是私有结构的typedef
例如:

CFStringRef CFStringCreateByCombiningStrings(CFAllocatorRef alloc, CFArrayRef array, CFStringRef separatorString);

有关不可变、可变和其他不透明类型对象变体的更多信息,请参阅对象的变体。

每个Core Foundation不透明类型都为其对象定义了一个唯一的类型ID,就像上面的CFArrayRef中CFArray对象一样。
类型ID是CFTypeID类型的整数,用于标识Core Foundation对象“所属”的不透明类型。
您可以在各种上下文中使用类型ID,例如在异构集合上操作时。
Core Foundation提供了用于获取和评估类型ID的编程接口。

重要提示:由于类型ID的值可以在不同版本之间更改,因此您的代码不应依赖于存储或硬编码的类型ID,也不应硬编码类型ID的任何观察到的属性(例如,它是一个小整数)。

此外,Core Foundation定义了一个通用的对象引用类型CFTypeRef,类似于某些面向对象编程语言中的根类。
此通用引用用作多态函数的参数和返回值的占位符类型,可以引用任何Core Foundation对象。
有关此主题的更多信息,请参阅多态函数。
有关使用对象引用时与内存管理相关的问题,请参阅 Core Foundation的内存管理编程指南


四、多态函数

Core Foundation提供了几个多态函数。
这些函数可以将任何Core Foundation对象作为参数,并且(在一个实例中,CFRetain)可以返回任何Core Foundation对象。
这些参数和返回值被赋予CFTypeRef的类型,一种通用的对象引用类型。
CFType类似于面向对象语言中的根类,因为它的函数可以被所有其他对象重用。

您将多态函数用于所有Core Foundation对象通用的操作:

  • 引用计数。
    CFType提供了几个多态函数来操作和获取对象的引用计数。
    有关这些函数的更多信息,请参阅 Core Foundation的内存管理编程指南
  • 比较对象。
    这个函数CFEqual任意两个Core Foundation对象(见比较对象)。
    相等的基础取决于所比较对象的类型。
    例如,如果两个对象都是CFString对象,则测试涉及character-by-character比较。
  • 散列对象。
    这个CFHash函数返回一个唯一的哈希码,标识一个Core Foundation对象(参见比较对象)。
    您可以使用哈希码作为哈希表结构中的表地址。
    如果两个对象相等(由CFEqual函数确定),它们必须具有相同的哈希值。
  • 检查对象。
    CFType为您提供了检查对象的方法,从而了解它们的内容和它们“所属”的类型。
    CFCopyDescription函数返回描述对象的字符串(更准确地说,是对CFString对象的引用)。
    CFCopyTypeIDDescription函数采用CFTypeID而不是CFTypeRef参数,返回描述由类型ID标识的不透明类型的字符串引用。
    这些函数主要用于帮助调试;有关这些函数的更多信息,请参阅检查对象。
    您还可以通过使用CFGetTypeID函数获取泛型类型对象的类型ID,然后将该值与已知类型ID进行比较来确定泛型类型对象所属的不透明类型。
    有关此任务的详细信息,请参阅检查对象。

五、物体的种类

不透明类型根据其对象的可编辑性和可扩展性特征,多达三种基本变体或“风味”:

  • 不可变和固定大小
  • 可变和固定大小
  • 可变和可变大小

可变对象是可编辑的,这意味着它们的内容可以更改。
不可变对象是不可编辑的;一旦创建,它们就不能更改。
任何更改不可变对象的尝试通常会导致某种错误。
固定大小的对象有它可以增长到的最大限制;对于CFString,这将是字符数,对于集合,限制将是元素数。

一些不透明类型,如CFString和CFArray,可以创建所有三种类型的对象。
大多数不透明类型可以创建不可变的、固定大小的对象,并且通常至少有一个不合格的创建函数来完成这项工作(如CFArrayCreate)。
可变固定大小与可变大小的决定因素是类型CreateMutable函数中容量或最大长度参数的值;任何正值都会产生固定大小的对象,但0指定可变大小的对象。

对可变对象的引用在类型名称中包含“Mutable”,例如CFMutableStringRef


六、命名约定

Core Foundation中的一个主要programming-interface约定是使用与符号最密切相关的不透明类型的名称作为符号的前缀。
对于函数,此前缀不仅标识函数“所属”的类型,而且通常标识作为函数操作目标的对象的类型。
(此约定的一个例外是常量,它将“k”放在类型前缀之前。)以下是头文件中的一些示例:

/* from CFDictionary.h */
CF_EXPORT CFIndex CFDictionaryGetCountOfKey(CFDictionaryRef dict, const void *key);
/* from CFString.h */
typedef UInt32 CFStringEncoding;
/* from CFCharacterSet.h */
typedef enum {kCFCharacterSetControl = 1,kCFCharacterSetWhitespace,kCFCharacterSetWhitespaceAndNewline,kCFCharacterSetDecimalDigit,kCFCharacterSetLetter,kCFCharacterSetLowercaseLetter,kCFCharacterSetUppercaseLetter,kCFCharacterSetNonBase,kCFCharacterSetDecomposable,kCFCharacterSetAlphaNumeric,kCFCharacterSetPunctuation,kCFCharacterSetIllegal
} CFCharacterSetPredefinedSet;

除了与不透明类型和内存管理相关的约定之外,Core Foundation还有一些programming-interface约定。

  • 在返回值的函数名称中,Get、Copy和Create之间有一个重要的区别。
    如果使用Get函数,则无法确定返回对象的生命周期。
    为了确保此类对象的持久性,您可以保留它(使用CFRetain函数),或者在某些情况下复制它。
    如果使用Copy或Create函数,则负责释放对象(使用CFRelease函数)。
    有关详细信息,请参阅 Core Foundation的内存管理编程指南
  • 一些Core Foundation对象有自己的命名约定,以在常见操作之间施加一致性。
    例如,集合在函数名称中嵌入以下动词以表示对集合元素的特定操作:
    • “添加”表示“如果不存在则添加,如果存在则不执行任何操作”(如果是唯一集合)。
    • “替换”意味着“如果存在则替换,如果不存在则不做任何事情。”
    • “设置”意味着“如果不存在则添加,如果存在则替换。”
    • “删除”的意思是“如果存在则删除,如果不存在则不做任何事情。”
  • CFIndexCFIndex类型用于索引、计数、长度和大小参数以及返回值。
    此类型表示的整数值(当前为32位)可以随着处理器地址大小的增长而增长。
    在指针大小不同的架构上,例如64位,CFIndex可以声明为64位,与int的大小无关。
    通过对与同一类型的Core Foundation参数交互的变量使用CFIndex,您可以确保代码具有更高程度的源代码兼容性。
  • 一些Core Foundation头文件似乎定义了不透明的类型,但实际上包含与特定类型无关的便利函数。
    一个典型的例子是CFPropertyList.h
    CFProperty tyList是任何属性列表类型的占位符类型:CFString、CFData、CFBoolean、CFNumber、CFDate、CFArray和CFDictionr。
  • 除非另有说明,所有用于返回值的引用参数都可以接受NULL
    这表明调用者对该返回值不感兴趣。

七、其他类型

Core Foundation定义了许多函数中常用的数据类型。
其中一些类型的目的是抽象出可能随着处理器地址空间变化而改变的原始值。
例如,CFIndex类型用于索引、计数、长度和大小参数。
CFOptionFlags类型用于位域参数,CFHashCode类型保存从CFHash函数返回的散列结果和某些散列回调。

其他基本类型用于获取和返回比较和范围值的函数中。
CFRange是一种结构,它指定项目线性序列的任何部分,从字符串中的字符到集合中的元素。
对于比较函数,CFCompisonResult类型定义enum常量来表示适当的返回值(等于、小于、大于)。
一些Core Foundation函数对比较器函数进行回调;如果需要自定义比较器,函数必须符合CFComparatorFunction类型指定的签名。

重要提示:某些Core Foundation类型(特别是CFIndex和CFTypeID)的整数值会随着处理器地址大小的增长而增长。
通过对与同一类型的Core Foundation参数交互的变量使用基本类型,您将确保代码具有更高程度的源代码兼容性。

Core Foundation提供的其他不透明类型将在单独的主题中讨论。


八、比较对象

您将两个Core Foundation对象与CFEqual函数进行比较。
如果两个对象本质上相等,则该函数返回布尔真值。
“基本”相等性取决于比较的对象类型。
例如,当您比较两个CFString对象时,Core Foundation认为它们在逐个字符匹配时本质上相等,而不管它们的编码或可变属性如何。
当两个CFArray对象具有相同的元素计数时,它们被认为是相等的并且一个数组中的每个元素对象与另一个数组中的对应对象本质上相等。
显然,比较的对象必须具有相同的类型(或相同类型的可变或不可变变体)才能被认为是相等的。

下面的代码片段展示了如何使用CFEqual函数将常量与传入参数进行比较:

void stringTest(CFStringRef myString) {Boolean equal = CFEqual(myString, CFSTR(“Kalamazoo”));if (!equal) {printf(“They’re not equal!");}else {printf(“They’re equal!):}
}

九、检查对象

Core Foundation对象的一个主要特征是它们基于不透明(或私有)类型;因此很难直接检查对象的内部数据。
然而,Base Services提供了两个函数,您可以使用它们检查Core Foundation对象。
这些函数返回对象和对象类型的描述。

要查找Core Foundation对象的内容,请在该对象上调用CFCopyDescription函数,然后打印引用的字符串对象中“包含”的字符序列:

例1 使用CFCopyDescription

void describe255(CFTypeRef tested) {char buffer[256];CFIndex got;CFStringRef description = CFCopyDescription(tested);CFStringGetBytes(description,CFRangeMake(0, CFStringGetLength(description)),CFStringGetSystemEncoding(), '?', TRUE, buffer, 255, &got);buffer[got] = (char)0;fprintf(stdout, "%s", buffer);CFRelease(description);
}

这个例子只展示了打印描述的一种方法。
您可以使用CFStringGetBytes以外的CFString函数来获取实际字符串。

要确定未知对象的类型,请使用CFGetTypeID函数获取其类型ID,并将该值与已知类型ID进行比较,直到找到匹配项。
您可以使用CFGetTypeID函数获取对象的类型ID。
每个不透明类型还定义了CFTypeGetTypeID形式的函数(例如,CFArrayGetTypeID);此函数返回该类型的类型ID。
因此,您可以测试CFType对象是否是特定不透明类型的成员,如下所示:

CFTypeID type = CFGetTypeID(anObject);
if (CFArrayGetTypeID() == type)printf(“anObject is an array.);
elseprintf(“anObject is NOT an array.);

要在调试器中显示有关Core Foundation对象类型的信息,请使用CFGetTypeID函数获取其类型ID,然后将该值传递给CFCopyTypeIDDescription函数:

/* aCFObject is any Core Foundation object */
CFStringRef descrip = CFCopyTypeIDDescription(CFGetTypeID(aCFObject));

注意: 字符串服务包括两个函数,都在CFString.h中声明,您可以调用支持的调试器来打印Core Foundation对象的描述:CFShowCFShowStr

重要提示: CFCopyDescription 的CFCopyDescriptionCFCopyTypeIDDescription函数仅用于调试。
因为描述中的信息及其格式可能会发生变化,所以不要在代码中创建对它们的依赖关系。


十、免费桥接类型

核心基础框架和基础框架中有许多数据类型可以互换使用。
可以互换使用的数据类型也称为免费桥接数据类型。
这意味着您可以使用相同的数据结构作为核心基础函数调用的参数或作为Objective-C消息调用的接收者。
例如,NSLocale(参见 NSLocale类参考 )可以与其核心基础对应的CFLocale(参见 CFLocale参考 )互换。

并非所有数据类型都是免费桥接的,尽管它们的名称可能表明它们是免费桥接的。
例如,NSRunLoop不是免费桥接到CFRunLoop的,NSBundle不是免费桥接到CFBundle的,NSDateFormatter不是免费桥接到CFDateForware的。
表1提供了支持免费桥接的数据类型列表。

注意: 如果您在正在使用的Core Foundation集合上安装自定义回调,包括NULL回调,则从Objective-C访问时,其内存管理行为未定义。


强制转换和对象生命周期语义

通过免费桥接,在您看到例如NSLocale *参数的方法中,您可以传递CFLocaleRef,在您看到CFLocaleRef参数的函数中,您可以传递NSLocale实例。
您还必须为编译器提供其他信息:首先,您必须将一种类型转换为另一种类型;此外,您可能必须指示对象生命周期语义学。

编译器理解返回Core Foundation类型并遵循历史Cocoa命名约定的Objective-C方法(参见 高级内存管理编程指南 )。
例如,编译器知道,在iOS中,UIColor的CGColor方法返回的CGColor不属于所有。
您仍然必须使用适当的类型转换,如下例所示:

NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
[colors addObject:(id)[[UIColor lightGrayColor] CGColor]];

编译器不会自动管理Core Foundation对象的生命周期。
您可以使用强制转换(在objc/runtime.h中定义)或Core Foundation样式的宏(在NSObject.h中定义)告诉编译器对象的所有权语义学:

  • __bridge在Objective-C和Core Foundation之间转移指针而不转移所有权。
  • __bridge_retained或者CFBridgingRetain将Objective-C指针投射到Core Foundation指针,并将所有权转移给您。
    您负责调用CFRelease或相关函数来放弃对象的所有权。
  • __bridge_transferCFBridgingRelease将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。
    ARC负责放弃对象的所有权。

以下示例中显示了其中一些:

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;
CFStringRef cfIdentifier = CFLocaleGetIdentifier(gbCFLocale);
NSLog(@"cfIdentifier: %@", (__bridge NSString *)cfIdentifier);
// Logs: "cfIdentifier: en_GB"CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (NSLocale *)CFBridgingRelease(myCFLocale);
NSString *nsIdentifier = [myNSLocale localeIdentifier];
CFShow((CFStringRef)[@"nsIdentifier: " stringByAppendingString:nsIdentifier]);
// Logs identifier for current locale

下一个示例显示了由Core Foundation内存管理规则规定的Core Foundation内存管理功能的使用:

- (void)drawRect:(CGRect)rect {CGContextRef ctx = UIGraphicsGetCurrentContext();CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();CGFloat locations[2] = {0.0, 1.0};NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];[colors addObject:(id)[[UIColor lightGrayColor] CGColor]];CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);CGColorSpaceRelease(colorSpace);  // Release owned Core Foundation object.CGPoint startPoint = CGPointMake(0.0, 0.0);CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds));CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint,kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);CGGradientRelease(gradient);  // Release owned Core Foundation object.
}

免费桥接类型

表1提供了Core Foundation和Foundation之间可互换的数据类型列表。
对于每对,该表还列出了OS X的版本,其中它们之间的免费桥接可用。


Table 1 Data types that can be used interchangeably between Core Foundation and Foundation

核心基础类型基础班可用性
CFArrayRefNSArrayOS X 10.0
CFAttributedStringRefNSAttributedStringOS X 10.4
CFBooleanRefNSNumberOS X 10.0
CFCalendarRefNSCalendarOS X 10.4
CFCharacterSetRefNSCharacterSetOS X 10.0
CFDataRefNSDataOS X 10.0
CFDateRefNSDateOS X 10.0
CFDictionaryRefNSDictionaryOS X 10.0
CFErrorRefNSErrorOS X 10.5
CFLocaleRefNSLocaleOS X 10.4
CFMutableArrayRefNSMutableArrayOS X 10.0
CFMutableAttributedStringRefNSMutableAttributedStringOS X 10.4
CFMutableCharacterSetRefNSMutableCharacterSetOS X 10.0
CFMutableDataRefNSMutableDataOS X 10.0
CFMutableDictionaryRefNSMutableDictionaryOS X 10.0
CFMutableSetRefNSMutableSetOS X 10.0
CFMutableStringRefNSMutableStringOS X 10.0
CFNullRefNSNullOS X 10.2
CFNumberRefNSNumberOS X 10.0
CFReadStreamRefNSInputStreamOS X 10.0
CFRunLoopTimerRefNSTimerOS X 10.0
CFSetRefNSSetOS X 10.0
CFStringRefNSStringOS X 10.0
CFTimeZoneRefNSTimeZoneOS X 10.0
CFURLRefNSURLOS X 10.0
CFWriteStreamRefNSOutputStreamOS X 10.0

2024-06-16(日)

相关文章:

Apple - Core Foundation Design Concepts

本文翻译整理自:Core Foundation Design Concepts(更新日期:2013-12-16 https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFDesignConcepts/CFDesignConcepts.html#//apple_ref/doc/uid/10000122i 文章…...

lua中的lfs库介绍

lua中的lfs库介绍 说明常用函数解析lfs.attributeslfs.chdirlfs.currentdirlfs.dirlfs.mkdirlfs.rmdirlfs.locklfs.touchlfs.linklfs.setmodelfs.symlinkattributes 说明 lfs是lua中的一个文件系统库,提供了更多高级的文件和目录操作功能,使得lua可以更方…...

PyCharm 快捷键积累

1、快速格式化:Ctrl Alt L Ctrl Alt L 快捷键在 PyCharm 中是用于格式化代码的,它不仅仅适用于 HTML 代码,而是适用于多种编程和标记语言。...

C++进阶之AVL树

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …...

sizeof 和 strlen 比较

sizeof 和 strlen 在 C 语言中都是用于获取某种“大小”的,但它们之间有着显著的区别。 sizeof sizeof 是一个运算符,用于计算数据类型或对象在内存中的大小(以字节为单位)。它可以在编译时确定结果,因为它计算的是类…...

音视频开发—FFmpeg 打开摄像头进行RTMP推流

实验平台:Ubuntu20.04 摄像头:普通USB摄像头,输出格式为YUV422 1.配置RTMP服务器推流平台 使用Nginx 配置1935端口即可,贴上教程地址 ubuntu20.04搭建Nginxrtmp服务器) 2.配置FFmpeg开发环境 过程较为简单,这里不…...

D触发器(D Flip-Flop)与D锁存器(D Latch)

1 基础概念 我们先来简单回顾一下D触发器(D flip-flop)和D锁存器(D latch)的概念,以及它们在数字电路中的作用。 1.1 D触发器(D Flip-Flop) D触发器是一种数字存储器件,它在时钟信号…...

JDK19特性

JDK19特性 一、JAVA19概述 JDK 19 2022 年 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。 JDK 19 只有 7 个新特性: JEP 405: Record Patterns(记录模式)[1] (预览)JEP 422: Linux/RISC-V Port[2]JEP 424: Foreign …...

sql语句中常用的函数有那些

1、字符串函数 CONCAT(string1, string2, ...): 连接两个或多个字符串。 UPPER(string): 将字符串转换为大写。 LOWER(string): 将字符串转换为小写。 TRIM(string): 去除字符串两端的空格。 LENGTH(string): 返回字符串的长度。 SUBSTRING(string, start, length): 从字符串中…...

odoo17 小变更3 Warning、 “attrs “和 “states “不再用

odoo17 小变更 1、Warning from odoo.exceptions import ValidationError,Warning ImportError: cannot import name Warning from odoo.exceptions (D:\od172406\odoo\exceptions.py) 2、自 17.0 版起,不再使用 "attrs "和 "states "属性。 …...

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述 游戏暂停的功能是通过设置timeScale0实现的,不过在暂停游戏的时候,需要对角色进行预览和设置,为了实现这个功能,是通过鼠标控制相机的操作,为了使相机的操作丝滑,获取鼠标操作系数乘以Time.delta…...

服务端代码编写中MySql大小写在Java中报错问题解决

报错信息: 原因:MySql和Java变量大小写产生的冲突。 经过查阅各个博客等,得出浅显结论(不一定对):MySql大小写不敏感,Java大小写敏感,当Javabean转为MySql数据库表时,Ja…...

CRMEB 多店商品详情页装修说明

一、功能介绍 商家可调整商品详情各板块样式,可根据不同的需求开启或关闭单独的板块 二、操作流程 装修 > 商品详情 三、功能说明 1、商品信息 可控制商品详情页面商品信息的显示与隐藏 2、会员信息,排行榜 控制商品详情页面会员信息及排行榜的…...

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…...

简说PIP换源

概述 PIP(Python Package Installer)是 Python 的包管理工具,用于安装和管理 Python 包。默认情况下,PIP 从 Python 官方的包仓库(即 PyPI)下载和安装包。然而,由于网络原因,访问官…...

django学习入门系列之第三点《CSS基础样式介绍2》

文章目录 文字对齐方式外边距内边距往期回顾 文字对齐方式 水平对齐方式 text-align: center;垂直对齐方式 /* 注意&#xff0c;这个只能是一行来居中 */ line-height:/*长度*/ ;样例 <!DOCTYPE html> <html lang"en"> <head><meta charset…...

分布式光纤测温DTS在工程现场中稳定性与可靠性如何?

20年前&#xff0c;分布式光纤测温(Distributed Temperature Sensing&#xff0c;DTS)技术的发展尚不成熟&#xff0c;设备成本高昂&#xff0c;其稳定性与可靠性也存在一定问题。然而&#xff0c;经过二十多年的不断发展与创新&#xff0c;DTS技术在工程现场应用中取得了显著进…...

PHP多线程模块parallel的编译安装和多线程编程演示

从PHP7开始&#xff0c;多线程编原有的pthreads已经不在维护&#xff0c;而是使用parallel替代。 由于是新的模块&#xff0c;样例代码很少&#xff0c;这里总结一个简单的代码和详细的备注供大家参考。 编译和安装 parallel需要启用ZTS&#xff08;Zend Thread Safety&…...

记录grid布局属性

grid布局 分为容器和项目元素 容器属性 #container{display:grid;grid-template-columns:100px 100px 100px;/* 1fr 表示比例为占1份 */grid-template-columns:1fr 100px 1fr;/*100px为1列,自动填充,容器宽度不足则换行*/grid-template-columns:repeat(auto-fill,100px);/* …...

12.爬虫---PyMysql安装与使用

12.PyMysql安装与使用 1.安装 PyMySQL2.使用PyMySQL2.1创建数据表2.2连接数据库2.3增加数据2.4修改数据2.5查询数据2.6删除数据2.7关闭连接 3.总结 MySQL 安装可以看这篇文章MySql 安装与使用&#xff08;非常详细&#xff09; 1.安装 PyMySQL PyMySQL是Python中用于连接MySQL…...

VS2022遇到的两个问题

问题一&#xff1a;找不到定义的头文件 别的博主说是&#xff1a;在属性页里面进行改写&#xff0c;改成是&#xff0c;我试过之后并不行&#xff1b; 解决思路&#xff1a;但其实在右边视图里面找到你自己定义的头文件加到你运行文件中就行&#xff1b;因为程序就只有一个入口…...

【Android14 ShellTransitions】(六)SyncGroup完成

这一节的内容在WMCore中&#xff0c;回想我们的场景&#xff0c;是在Launcher启动某一个App&#xff0c;那么参与动画的就是该App对应Task&#xff08;OPEN&#xff09;&#xff0c;以及Launcher App对应的Task&#xff08;TO_BACK&#xff09;。在确定了动画的参与者后&#x…...

技术管理转型之战:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策&#xff08;Rational Decision Making&#xff09;2. 有限理性&#xff08;Bounded Rationality&#xff09;3. 直觉决策&#xff08;Intuitive Decision Making&#xff09;4. 循证管理&#xff08;Evidence-Base…...

Shell脚本:条件语句(if、case)

目录 硬编码 硬编码的缺点 条件判断 $? 命令行语句 判断指定目录是否存在 判断指定文件是否存在 判断指定对象是否存在 表达式形式语句 判断对象是否存在 判断对象是否有权限 与、或、非 运算 与运算 或运算 非运算 比较大小 判断磁盘利用率实验步骤 字符串…...

在Linux上为Windows目标配置Qt交叉编译

问题描述 我想使用Linux x86_64主机为Windows x86_64目标交叉编译Qt库&#xff08;最终也包括我的应用程序&#xff09;。我觉得自己已经接近成功了&#xff0c;但可能对整个过程有一些基本的误解。 我从在我的Fedora机器上安装所有mingw包开始&#xff0c;并修改了win32-g的…...

Introduction to linear optimization 第 2 章课后题答案 11-15

线性规划导论 Introduction to linear optimization (Dimitris Bertsimas and John N. Tsitsiklis, Athena Scientific, 1997)&#xff0c; 这本书的课后题答案我整理成了一个 Jupyter book&#xff0c;发布在网址&#xff1a; https://robinchen121.github.io/manual-introdu…...

Java——包

一、包 1、简要介绍 在Java编程语言中&#xff0c;包&#xff08;Package&#xff09; 是一种用来组织和管理类&#xff08;Class&#xff09;和接口&#xff08;Interface&#xff09;的机制。包为开发者提供了一种逻辑分组的方式&#xff0c;使代码更加模块化、结构化和易于…...

Pipeline知识小记

在scikit-learn&#xff08;通常缩写为sklearn&#xff09;中&#xff0c;Pipeline是一个非常重要的工具&#xff0c;它允许你将多个数据转换步骤&#xff08;如特征选择、缩放等&#xff09;和估计器&#xff08;如分类器、回归器等&#xff09;组合成一个单一的估计器对象。这…...

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具&#xff0c;适用于开发人员和测试人员。它提供了一个直观的界面&#xff0c;用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例&#xff0c;以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…...

人工智能对决:ChatGLM与ChatGPT,探索发展历程

图: a robot is writing code on a horse, By 禅与计算机程序设计艺术 目录 ChatGLM:...

探索Python元类的奥秘及其应用场景

探索Python元类的奥秘及其应用场景 一、引言 在Python中&#xff0c;元类&#xff08;Metaclasses&#xff09;是一个相对高级且容易被忽视的主题。然而&#xff0c;对于深入理解Python的面向对象编程模型以及进行高级框架和库的设计来说&#xff0c;元类是一个不可或缺的工具…...

C语言基础关键字的含义和使用方法

​关键字在C语言中扮演着非常重要的角色&#xff0c;它们定义了语言的基本构造和语法规则&#xff0c;通过使用关键字&#xff0c;开发者可以创建变量、定义数据类型、控制程序流程&#xff08;如循环和条件判断&#xff09;、声明函数等。由于这些字是保留的&#xff0c;所以编…...

【Golang - 90天从新手到大师】Day09 - string

系列文章合集 Golang - 90天从新手到大师 String 一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据&#xff0c;但是通常是用来包含人类可读的文本。 len()返回字符串字节数目&#xff08;不是rune数&#xff09;。 通过索引可以访问某个字节值&#xff0c;0…...

网络安全与区块链技术:信任与安全的融合

# 网络安全与区块链技术&#xff1a;信任与安全的融合 在网络空间&#xff0c;信任是一种宝贵而稀缺的资源。区块链技术以其独特的分布式账本、加密算法和共识机制&#xff0c;为构建网络安全提供了新的解决方案。本文将探讨网络安全与区块链技术如何融合&#xff0c;以增强信…...

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下&#xff0c;备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误&#xff0c;备库同样可能因为MySQL自身的特性导致数据不一致&#xff0c;例如MySQL的Bug、网络中断、服务…...

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HashSet 是 Java 集合框架中的一个重要成员&#xff0c;它提供了不存储重复元素的集合。但是&am…...

爬虫经典案例之爬取豆瓣电影Top250(方法二)

在上一篇文章的基础上&#xff0c;改进了代码质量&#xff0c;增加了多个正则表达式匹配&#xff0c;但同事也增加了程序执行的耗时。 from bs4 import BeautifulSoup import requests import time import re from random import randint import pandas as pdurl_list [https…...

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程&#xff0c;涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略&#xff1a; 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…...

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…...

python数据分析与可视化

Python 在数据分析和可视化方面有着广泛的应用,并且拥有众多强大的库和工具来支持这些任务。以下是一些常用的 Python 库和它们的主要用途: 数据分析 Pandas: Pandas 是 Python 中用于数据处理和分析的主要库。 它提供了数据框(DataFrame)和序列(Series)两种数据结构…...

webkit 的介绍

WebKit 是一个开源的网页浏览器引擎&#xff0c;它是 Safari 浏览器和许多其他应用程序的基础。WebKit 最初由苹果公司开发&#xff0c;并在2005年作为开源项目发布。WebKit 的核心组件包括 WebCore 和 JavaScriptCore。以下是 WebKit 的详细介绍&#xff1a; ### WebKit 的主…...

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…...

深度神经网络一

文章目录 深度神经网络 (DNN)1. 概述2. 基本概念3. 网络结构 深度神经网络的层次结构详细讲解1. 输入层&#xff08;Input Layer&#xff09;2. 隐藏层&#xff08;Hidden Layers&#xff09;3. 输出层&#xff08;Output Layer&#xff09;整体流程深度神经网络的优点深度神经…...

Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn

在探索现代 JavaScript 生态系统时&#xff0c;我们常常会遇到新兴技术的快速迭代和改进。其中&#xff0c;包管理工具的发展尤为重要&#xff0c;因为它们直接影响开发效率和项目性能。最近&#xff0c;pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 np…...

汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto

前言: 对于NXP的i.mx,如果基于linux开发,需要熟悉以下文档: IMX_YOCTO_PROJECT_USERS_GUIDE.pdf IMX_LINUX_USERS_GUIDE.pdf IMX_GRAPHICS_USERS_GUIDE.pdf 如果基于android开发,需要熟悉一下文档: Android_Auto_Quick_Start_Guide.pdf ANDROID_USERS_GUIDE.pdf …...

tessy 编译报错:单元测试时,普通桩函数内容相关异常场景

目录 1&#xff0c;失败现象 2&#xff0c;原因分析 1&#xff0c;失败现象 1&#xff0c;在 step 桩函数正常的情况下报错。 2&#xff0c;测试代码执行的数据流 和 step 桩函数内容不一致。 2&#xff0c;原因分析 桩函数分为 test object, test case, test step 三种类别。…...

计算机专业是否仍是“万金油”

作为一名即将参加高考的学生&#xff0c;我站在人生的分岔路口上&#xff0c;面临着选择大学专业的重大抉择。在这个关键节点&#xff0c;计算机相关专业是否仍是炙手可热的选择&#xff1f;  首先&#xff0c;从行业的角度来看&#xff0c;计算机相关专业确实在近年来持续火…...

雷池社区版自动SSL

正常安装雷池&#xff0c;并配置站点&#xff0c;暂时不配置ssl 不使用雷池自带的证书申请。 安装&#xff08;acme.sh&#xff09;&#xff0c;使用域名验证方式生成证书 先安装git yum install git 或者 apt-get install git 安装完成后使用 git clone https://gitee.com/n…...

怎样减少徐州服务器租用的成本?

服务器租用的出现&#xff0c;十分便于网络行业的发展&#xff0c;但是随着服务器租用的广泛应用&#xff0c;整体还是有着一定的成本的吗&#xff0c;不同的服务器类型在价格方面也是不同的&#xff0c;那么企业在选择服务器租用后&#xff0c;怎样才能减少服务器租用的成本呢…...

【性能优化】表分桶实践最佳案例

分桶背景 随着企业的数据不断增长&#xff0c;数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率&#xff0c;但对于某些特定的查询模式&#xff0c;特别是需要频繁地进行数据联接查或取样的场景&#xff0c;仍然可能面临性能瓶颈。此外…...