bundle字段

这些字段名都是XML中的名称,在xcode的属性编辑器中,名字并不相同

bundle目录中的属性列表详细描述了有关该bundle的信息。Finder和一些系统API在一些情况下会使用这些信息。bundle支持下列字段类型:

  • Core Foundation字段–描述了bundle的综合属性
  • Cocoa特定的字段–描述了和Cocoa有关的bundle的属性
  • Finder特定的字段–描述了和Finder与文件系统有关的信息
  • 启动服务字段–描述了和启动服务有关的信息

标准Bundle字段

Mac OS X 为描述bundle的信息提供了一组核心字段。集成开发环境会赋予这些字段缺省值。表A-1列出了这些字段。

表A-1 标准字段概要

字段
类型
是否必须
摘要
CFBundleDevelopmentRegion String No 该bundle的地区。通常对应于作者的母语。
CFBundleDisplayName String No 本地化的bundle名。
CFBundleDocumentTypes Array No 一组描述了该bundle所支持的文档类型的字典。
CFBundleExecutable String Yes 该bundle的可执行文件名。
CFBundleGetInfoHTML String No 用来在Finder的Get Info 面板中显示的更丰富内容的字符串。
CFBundleGetInfoString String No 用来在Finder的Get Info 面板中显示的字符串。
CFBundleHelpBookFolder String No 含有该bundle帮助文件的文件夹名字。
CFBundleHelpBookName String No 当该bundle的帮助启动时显示的帮助文件的名字。
CFBundleIconFile String Yes 图标文件的文件名。
CFBundleIdentifier String Yes 该bundle的唯一标识字符串。该字符串的格式类似java包的命名方式,例如:com.apple.myapp。
CFBundleInfoDictionaryVersion String Yes Info.plist格式的版本信息。
CFBundleName String Yes bundle的简称。
CFBundlePackageType String Yes 用来标识bundle类型的四个字母长的代码。
CFBundleShortVersionString String Yes 面向用户市场的bundle的版本字符串。
CFBundleSignature String Yes 用来标识创建者的四个字母长的代码。
CFBundleURLTypes Array No 一组描述了该bundle所支持的URL协议的字典。
CFBundleVersion String Yes 可执行文件的创建号。

CFBundleDevelopmentRegion

CFBundleDevelopmentRegion字段指定了一个字符串值来标识bundle的地区。通常对应于作者的母语。如果不能找到用户首选的地区或语言的资源,系统最后会使用该值。

CFBundleDisplayName

CFBundleDisplayName字段指定了一个字符串值来标识bundle的显示名称。Finder和其他用户界面组件会把它显示给用户。这个名称可以与文件系统中的bundle名不同。通过把字段加入适当的.lproj子目录中的InfoPlist.strings文件,就可以实现该字段的本地化。如果您需要本地化这个字段,您还应该提供一个CFBundleName字段的本地化版本。

有关显示名称的更多信息参见“本地化文件系统名称”

CFBundleDocumentTypes

CFBundleDocumentTypes字段保存了一组字典,它包含了该应用程序所支持的文档类型。每一个字典都被称做类型定义字典,并且包含了用于定义文档类型的字段。表A-2列出了类型定义字典中支持的字段。

表 A-2 CFBundleDocumentTypes字典的字段

字段
类型
描述
CFBundleTypeExtensions Array 该字段包含了一组映射到这个类型的文件扩展名。为了打开具有任何扩展名的文档,可以用单个星号“*”。该字段是必须的。
CFBundleTypeIconFile String 该字段指定了系统显示该类文档时使用的图标文件名,该图标文件名的扩展名是可选的。如果没有扩展名,系统会根据平台指定一个(例如,Mac OS 9中的.icons)。
CFBundleTypeName String 该字段包含了这种文档类型的抽象名称。通过在适当的InforPlist.strings文件中包含该字段,可以实现对它的本地化。
CFBundleTypeOSTypes Array 该字段包含了一组映射到这个类型的四字母长的类型代码。为了打开所有类型的文档,可以把它设为“****”。该字段是必须的。
CFBundleTypeRole String 该字段定义了那些与文档类型有关的应用程序的角色。它的值可以是Editer,Viewer,Printer,Shell或None。有关这些值的详细描述可以参见“ 文档的配置”。该字段是必须的。
NSDocumentClass String 该字段描述了被用来实例化文档的NSDocument子类。仅供Cocoa应用程序使用。
NSExportableAs Array 该字段描述了一组可以输出的文档类型。仅供Cocoa应用程序使用。

CFBundleExecutable

CFBundleExecutable 标识了bundle的可执行主文件的名称。对于一个应用程序来说,就是该应用程序的可执行文件。对于一个可加载bundle,它是一个可以被bundle动态加载的二进制文件。对于一个框架,它是一个共享库。Project Builder会自动把该字段加入到合适项目的Info.plist文件中。

对于框架,考虑到启动效率的原因,可执行文件名需要和框架名同名。该可执行文件名不应该包含可用于多种平台的扩展名。

注意

您必须在bundle的Info.plist文件中包含一个有效的CFBundleExecutable字段。即使当用户重命名应用程序或bundle的目录时,Mac OS X也可以使用这个字段来定位可执行文件和共享库。

CFBundleGetInfoHTML

CFBundleGetInfoHTML字段含有会在bundle的信息窗口中显示的HTML字符串。如果您希望在信息窗口中有更强的表现力,可以使用这个键值对来替代纯文本的CFBundleGetInfoString。通过把它加入到合适的.lproj目录中的InfoPlist.strings文件中,您也可以本地化该字符串。

如果CFBundleGetInfoString和CFBundleGetInfoHTML同时存在的话,系统会选择使用CFBundleGetInfoHTML。

CFBundleGetInfoString

CFBundleGetInfoString字段含有会在bundle的信息窗口中显示的纯文本字符串(这里的字符串也就是Mac OS 9中的长字符串)。该字段的格式应该遵照Mac OS 9中的长字符串,例如:“2.2.1, ? Great Software, Inc, 1999”。通过把它加入到合适的.lproj目录中的InfoPlist.strings文件中,您也可以本地化该字符串。

如果存在CFBundleGetInfoHTML的话,系统不会选择使用该字段。

CFBundleHelpBookFolder

CFBundleHelpBookFolder字段含有该bundle的帮助文件的文件夹名字。帮助通常被本地化成一种指定的语言,所以该字段指向的文件夹应该是所选择语言的.lproj目录中的文件夹。

CFBundleHelpBookName

CFBundleHelpBookName指定了您的应用程序的帮助主页。该字段指定的帮助页面名可以和HTML文件名不同。在帮助文件META标签的CONTENT属性中指定了帮助页面名。

CFBundleIconFile

CFBundleIconFile字段指定了包含该bundle图标的文件。您给出的文件名不需要包含“.icns”扩展名。Finder会在该bundle的“Resource”文件夹内寻找图标文件。

如果您的bundle使用了自定义的图标,那您就必须指定该属性。假如您没有指定,Finder(和其他应用程序)会使用缺省的图标来显示您的bundle。

CFBundleIdentifier

CFBundleIdentifier字段指定了bundle的一个唯一的标识字符串。该标识符采用了类似Java包的命名方式,例如com.apple.myapp。该bundle标识符可以在运行时定位bundle。预置系统使用这个字符串来唯一地标识每个应用程序。

CFBundleInfoDictionaryVersion

CFBundleInfoDictionaryVersion字段指定了属性列表结构的当前版本号。该字段的存在使得可以支持Info.plist格式将来的版本。在您建立一个bundle时,Project Builder会自动产生该字段。

CFBundleName

CFBundleName指定了该bundle的简称。简称应该小于16个字符并且适合在菜单和“关于”中显示。通过把它加入到适当的.lproj子文件夹下的InfoPlist.strings文件中,该字段可以被本地化。如果您本地化了该字段,那您也应该提供一个CFBundleDisplayName字段的本地化版本。

CFBundlePackageType

CFBundlePackageType字段指定了bundle的类型,类似于Mac OS 9的文件类型代码。该字段的值包含一个四个字母长的代码。应用程序的代码是‘APPL’;框架的代码是‘FMWK’;可装载bundle的代码是‘BND’。如果您需要,您也可以为可装载bundle选择其他特殊的类型代码。

CFBundleShortVersionString

CFBundleShortVersionString字段指定了bundle的版本号。一般包含该bundle的主、次版本号。这个字符串的格式通常是“n.n.n”(n表示某个数字)。第一个数字是bundle的主要版本号,另两个是次要版本号。该字段的值会被显示在Cocoa应用程序的关于对话框中。

该字段不同于CFBundleVersion,它指定了一个特殊的创建号。而CFBundleShortVersionString的值描述了一种更加正式的并且不随每一次创建而改变的版本号。

CFBundleSignature

CFBundleSignature字段指定了bundle的创建者,类似于Mac OS 9中的文件创建者代码。该字段的值包含四字母长的代码,用来确定每一个bundle。

CFBundleURLTypes

CFBundleURLTypes字段包含了一组描述了应用程序所支持的URL协议的字典。它的用途类似于CFBundleDocumentTypes的作用,但它描述了URL协议而不是文档类型。每一个字典条目对应一个单独的URL协议。表A-3列出了在每一个字典条目中使用的字段。

表A-3 CFBundleURLTypes字典的字段

字段
类型
描述
CFBundleTypeRole String 该字段定义了那些与URL类型有关的应用程序的角色(即该应用程序与某种文档类型的关系)。它的值可以是Editer,Viewer,Printer,Shell或None。有关这些值的详细描述可以参见“ 文档的配置”。该字段是必须的。
CFBundleURLIconFile String 该字段包含了被用于这种URL类型的图标文件名(不包括扩展名)字符串。
CFBundleURLName String 该字段包含了这种URL类型的抽象名称字符串。为了确保唯一性,建议您使用Java包方式的命名法则。这个名字作为一个字段也会在InfoPlist.strings文件中出现,用来提供该类型名的可读性版本。
CFBundleURLSchemes Array 该字段包含了一组可被这种类型处理的URL协议。例如:http,ftp等。

CFBundleVersion

CFBundleVersion字段指定了一个字符串用来标识创建号。该字段的值通常随每一次创建而改变,并且会被显示在Cocoa”关于”对话框中的扩号里。

为了指定一个发布版的bundle的版本信息,可以使用CFBundleShortVersionString字段。参见“CFBundleShortVersionString”

应用程序特定的字段


表A-4列出了仅用于应用程序bundle的字段:

表A-4应用程序特定的字段

字段
类型
是否必须
摘要
CFAppleHelpAnchor String No 该bundle的初始HTML帮助文件。
NSAppleScriptEnabled String No 指定是否支持AppleScript。
NSHumanReadableCopyright String Yes 显示在对话框中的版权信息。
NSJavaNeeded Boolean or String No 指定该程序是否需要一个Java虚拟机。
NSJavaPath Array No 一组Java类所在的路径(前面需要加上NSJavaRoot)。
NSJavaRoot String No 包含Java类的根目录。
NSMainNibFile String Yes 应用程序的主nib文件名。
NSPrincipalClass String Yes bundle的主类的名字。
NSServices Array No 一组描述了由应用程序所提供的服务的字典。

CFAppleHelpAnchor

CFAppleHelpAnchor字段定义了bundle的初始HTML帮助文件名,不需要包括.html或.htm扩展名。这个文件位于bundle的本地化资源目录中,或者如果没有本地化资源目录的话,则直接被放在Resources目录中。

NSAppleScriptEnabled

NSAppleScriptEnabled字段说明了该应用程序是否支持AppleScript。如果您的应用程序支持,就需要把该字符串的值设为“Yes”。

NSHumanReadableCopyright

NSHumanReadableCopyright字段包含了一个含有bundle的版权信息的字符串。您可以在“关于”对话框中显示它。该字段通常会出现在InfoPlist.strings文件中,因为往往需要本地化该字段的值。

NSJavaNeeded

NSJavaNeeded字段含有一个布尔值,用来确定在执行该bundle的代码之前Java虚拟机是否需要被载入并运行。您也可以指定一个字符串类型的值“YES”代替布尔型的值。

NSJavaPath

NSJavaPath字段包含了一组路径。每一个路径指向一个Java类。该路径相对于由NSJavaRoot字段定义的位置来说,可能是一个绝对路径也可能是一个相对路径。开发环境会自动把这些值保存在数组中。

NSJavaRoot

NSJavaRoot字段含有一个指向一个目录的字符串。该目录是应用程序的Java类文件的根目录。

NSMainNibFile

NSMainNibFile字段包含了一个含有应用程序的主nib文件名(不包含.nib文件扩展名)的字符串。一个nib文件作为一个Interface Builder的存档文件,含有对用户界面的详细描述信息以及那些界面中的对象之间的关联信息。当应用程序被启动时,主nib文件会被自动装载。Mac OS X会寻找与应用程序名相匹配的nib文件。

NSPrincipalClass

NSPrincipalClass字段定义了一个bundle的主类的名称。对于应用程序来说,缺省情况下这个名字就是应用程序的名字。

NSServices

NSServices包含了一组字典,它详细说明了应用程序所提供的服务。表A-5列出了用来指定服务的字段。

表 A-5 NSServices字典的字段

字段
类型
描述
NSPortName String 该字段指定了由您的应用程序监听器为接受外部服务请求所提供的端口名称。
NSMessage String 该字段指定了用来调用该服务的实例方法名。在Objective-C中,实例方法的形式是messageName:userData:error:。在Java中,实例方法的形式是messageName(NSPasteBoard.String)。
NSSendTypes Array 该字段指定了一组可以被该服务读取的数据类型名。NSPasteboard类列出了几个常用的数据类型。您必须包含此字段,NSReturnTypes,或者两者。
NSReturnTypes Array 该字段指定了一组可以被该服务返回的数据类型名。NSPasteboard类列出了几个常用的数据类型。您必须包含此字段,NSSendTypes,或者两者。
NSMenuItem Dictionary 该字段包含一个字典,它指定了加入Services菜单中的文本。字典中的唯一一个字段被称为default并且它的值是菜单项的文本。该值必须是唯一的。您可以使用斜杠“/”来指定一个子菜单。例如,Mail/Send出现在Services菜单中时就是一个带有Send子菜单并且名为Mail的菜单。
NSKeyEquivalent Dictionary 该字段是可选的,并且包含一个含有用来请求服务菜单命令的快捷按键的字典。与NSMenuItem类似,字典中的唯一一个字段被称为default并且它的值是单个的字符。用户可以通过按下Command,Shift功能键和相应的字符来请求该快捷按键。
NSUserData String 该字段是一个可选字符串,它含有您的选择值。
NSTimeout String 该字段是一个可选的数字字符串,它指定了从应用程序请求服务到收到它的响应所需要等待的毫秒数。

启动服务字段

启动服务字段规定了Mac OS X中的应用程序是怎样被启动的。这些字段适用于CFM和Mach-O可执行文件。有关CFM和Mach-O可执行文件的详情可参见“安装和集成”一章中的“CFM可执行文件”。表A-6列出了启动服务的字段。

表A-6启动服务字段

字段
类型
是否必须
摘要
LSBackgroundOnly String No 指定了应用程序是否仅仅运行在后台。(仅适用于Mach-O的应用程序)。
LSPrefersCarbon String No 指定了应用程序是否优先运行在Carbon环境中。
LSPrefersClassic String No 指定了应用程序是否优先运行在Classic环境中。
LSRequiresCarbon String No 指定了应用程序是否必须运行在一个Carbon环境中。
LSRequiresClassic String No 指定了应用程序是否必须运行在一个Classic环境中。
LSUIElement String No 指定了应用程序是否是一个用户界面组件,即一个应用程序不应该出现在Dock中或强制退出窗口。

LSBackgroundOnly

如果该字段存在并且被设为“1”,启动服务将只会运行在后台。您可以使用该字段来创建无用户界面的后台应用程序。如果您的应用程序使用了连接到窗口服务器的高级框架,但并不需要显示出来,您也应该使用该字段。后台应用程序必须被编译成Mach-O可执行文件。该选项不适用于CFM应用程序。

您也可以指定该字段的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。

LSPrefersCarbon

如果该字段被设为“1”,Finder将会在显示简介面板中显示“在Classic环境中打开”控制选项,缺省情况下该控件未被选中。如果需要,用户可以修改这个控制选项来在Classic环境中启动应用程序。

您也可以指定该字段的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该字段,那么就不要同时加入LSPrefersClassic, LSRequiresCarbon,或LSRequiresClassic字段。

LSPrefersClassic

如果该字段被设为“1”,Finder将会在显示简介面板中显示“在Classic环境中打开” 控制选项,缺省情况下该控件被选中。如果需要,用户可以修改这个控制选项来在Carbon环境中启动应用程序。

您也可以指定该字段的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该字段,那么就不要同时加入LSPrefersCarbon, LSRequiresCarbon,或LSRequiresClassic字段。

LSRequiresCarbon

如果该字段被设为“1”,启动服务将只在Carbon环境中运行应用程序。如果您的应用程序不应该运行在Classic环境中的话,可以使用该字段。

您也可以指定该字段的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该字段,那么就不要同时加入LSPrefersCarbon, LSPrefersClassic,或LSRequiresClassic字段。

LSRequiresClassic

如果该字段被设为“1”,启动服务将只在Classic环境中运行应用程序。如果您的应用程序不应该运行在Carbon兼容环境中的话,可以使用该字段。

您也可以指定该字段的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该字段,那么就不要同时加入LSPrefersCarbon, LSPrefersClassic,或LSRequiresCarbon字段。

LSUIElement

如果该字段被设为“1”,启动服务会将该应用程序作为一个用户界面组件来运行。用户界面组件不会出现在Dock或强制退出窗口中。虽然它们通常作为后台应用程序运行,但是如果希望的话,它们也可以在前台显示一个用户界面。点击属于用户界面组件的窗口,应用程序将会处理产生的事件。

Dock和登录窗口是两个用户界面组件应用程序。

应用程序包字段


应用程序打包的目的是把一个应用程序打包成一个自我包含的实体,并且对用户隐藏了它的内容。然而,用户常常希望操作应用程序的某些文件。例如,用户可能希望添加或删除某个插件,本地化资源,等等。开发者可以在Info.plist 文件中指定一些可以由用户维护的项目。那么Finder会把这些项目显示在bundle的信息面板中,并允许用户浏览,删除或添加这些项目。

CFBundleInstallerInfo

应用程序打包信息的根字段是CFBundleInstallerInfo。该字段定义了一个字典,它包含了表A-7中所列出的字段。“是否必须”列指出了哪些是您必须支持的功能。

表A-7应用程序打包字段

字段
类型
是否必须
摘要
APInstallerURL String Yes 一个指向您希望安装的文件的URL路径。
APFiles Array Yes 一组字典,描述了那些可以被安装的文件或目录。

APInstallerURL

APInstallerURL字段指定了一个指向您希望安装的文件的路径。您必须以file://localhost/path/ 形式来说明这个路径。所有被安装的文件必须位于这个文件夹中。

APFiles

APFiles字段指定了一个字典,描述了您希望安装的文件。每个字典条目可以包含某个文件或目录的描述。您可以让APFiles 字段包含在其自身中,用于指定在目录内部的文件。表A-8列出了用来指定有关单个文件或目录的信息。

表A-8 APFiles字典字段

字段
类型
描述
APFileDescriptionKey String 用来显示在Finder的信息窗口中的简短描述。
APDisplayedAsContainer String 如果值为“Yes”,该项目作为一个目录图标显示在信息面板中;否则,它被显示为一个文档图标。
APFileDestinationPath String 一个安装组件的相对路径。
APFileName String 文件或目录的名称。
APFileSourcePath String 指向应用程序包中组件的路径,相对与APInstallerURL路径。
APInstallAction String 操纵组件的动作:“Copy”或者“Open”

 UIFileSharingEnabled   应用程序支持itunes共享文件夹   值为 boolean 值   YES 共享;  NO 不共享

这个字段在字段编辑器中的名称为: Application supports iTunes file sharing

Info.plist 的字段解释的更多相关文章

  1. Nutch2 WebPage 字段解释

    Nutch2 WebPage 字段解释 Nutch2.2.1 id

  2. SAP QM 主检验特性主数据关键字段解释

    SAP QM 主检验特性主数据关键字段解释 检验特征是QM模块中的一项重要主数据,可以说是QM检验业务的构成基础,它通过体现在Task list (检验任务清单)和/或material specifi ...

  3. MySQL-EXPLAIN执行计划字段解释

    做 MySQL 查询优化遇到明明建了索引查询仍然很慢,看这个 SQL 的执行计划,看它到底有没有用到索引,执行的具体情况.我们可以用 EXPLAIN 命令查看 SQL 的执行计划,SQL 优化的重要性 ...

  4. mysql索引优化及explain关键字段解释

    一.explain关键字解释 1.id MySQL QueryOptimizer 选定的执行计划中查询的序列号,表示查询中执行select 子句或操作表的顺序.id 值越大优先级越高,越先被执行.id ...

  5. HTTP请求头中各字段解释

    Accept : 浏览器(或者其他基于HTTP的客户端程序)可以接收的内容类型(Content-types),例如 Accept: text/plain Accept-Charset:浏览器能识别的字 ...

  6. Django model 中的字段解释

    Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需 ...

  7. Django-website 程序案例系列-17 forms表单验证的字段解释

    1.Django内置字段如下: Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial ...

  8. Oracle中V$SESSION等各表的字段解释,Oracle官方解释

    一.常用的视图 1.会话相关视图 View Description V$PROCESS Contains information about the currently active processe ...

  9. MySQL使用explain时各字段解释

    1.id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 三种情况: (1)id相同,执行顺序由上至下 id相同,执行顺序由上至下 此例中 先执行where 后的 ...

随机推荐

  1. jdk环境变量配置(参考自《疯狂java讲义》)

    做个记录,免得每次配环境都要百度 环境变量的配置 path环境变量配置的作用:程序的执行需要使用外部指令javac, 但是javac指令仅仅能在JDK安装目录下的bin目录下使用,因此程序只能写入bi ...

  2. mysql 5.5安装/卸载使用总结

    安装 卸载 1.在控制面板->卸载与更改程序 中卸载mysql 2.删除安装目录下的mysql文件夹 3.删除隐藏文件夹C:\ProgramData\中的MySQL,否则再次安装时会卡在 sta ...

  3. CDC相关知识点总结

    跨时钟域设计很重要,每一个项目都会有,这个要马上学会总结好.本能力属于重要而且急需的能力.

  4. js,jq,php使用正则方法

    1.js使用正则表达式案例: <script> var str=”543535364565@qq.com”; var res=“/^\d*@(QQ|qq|136)\.(com|cn)$/” ...

  5. python--网络通信协议

    一 . osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 二 . tcp三次握手和四次挥手 我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真 ...

  6. Python中单元测试出错了,会怎么样?

    在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况. 原say_hello_name.py def hello_name(name): ...

  7. Python9-装饰器进阶-day12

    wapers方法 def wahaha(): ''' sljfldsjflds :return: ''' print('娃哈哈') print(wahaha.__name__) #查看字符串格式的函数 ...

  8. chrome 下载插件包及离线安装 附 Advanced Rest Client 下载

    最近需要测试http rest服务,由于chrome插件的轻便,首先想到了用chrome插件,在google商店找到Advanced Rest Client,用了一阵感觉不错. 于是项目组其他同事也要 ...

  9. mysql无法启动,报错 Can't start server: can't create PID file: No space left on device

    然后看mysql日志文件 出现Can't start server: can't create PID file: No space left on device 这个错误. 提示磁盘空间不足 后用d ...

  10. shell的until循环

    until 循环执行一系列命令直至条件为 true 时停止.until 循环与 while 循环在处理方式上刚好相反.一般while循环优于until循环,但在某些时候,也只是极少数情况下,until ...