Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成

作者:zyl910

  手工写文档是一件苦差事,幸好现在有从源码中抽取注释生成文档的专用工具。对于Objective-C来说,目前最好用的工具是appledoc和doxygen。可是这两种工具对于注释的要求略有区别。于是我经过一番摸索,找到了一套能同时兼容这两种工具的注释写法。

  工具简介——
appledoc:简单方便,适于生成apple风格的html文档,及直接集成到xcode帮助(docset)。官网 http://gentlebytes.com/appledoc/ 。
doxygen:功能强大,适于生成html文档与pdf文档。官网 http://www.stack.nl/~dimitri/doxygen/index.html 。

  系统环境——
Mac OS X Lion 10.7.5
Xcode 4.6.2
appledoc 2.1
doxygen 1.8.4
MacTeX-2012

一、注释写法

  提示:这一章主要是参考性内容,比较枯燥。请根据需要来阅读——
对于想简单学一下注释写法的,读前4节就行了;
对于想全面学习appledoc与doxygen均兼容的注释写法的,读前6节就行了;
对于既想使用appledoc,又想使用doxygen增强效果的,请阅读所有的节。

1.1 注释形式

  标准C/C++的注释形式有“//”形式的单行注释 与“/* */”形式的多行注释这两种。
  而appledoc与doxygen的文档化注释是它们的变种,有多种形式。例如appledoc与doxygen均兼容的注释形式有以下7种——

/// Single line comment.

/// Single line comment spreading
/// over multiple lines.

/** Single line comment. */

/** Single line comment spreading
 * over multiple lines.
 */

/** Single line comment spreading
 over multiple lines. No star.
 */

/*! Single line comment. */

/*! Single line comment spreading
 over multiple lines.
 */

 

  虽然appledoc与doxygen都支持。但在平时编写代码时,为了避免风格杂乱的视觉污染,应该固定使用注释形式。

1.1.1 单行注释

  在很多时候只需写一个简要描述就够了,这时最好使用单行注释。推荐格式为——

/// 简要描述.

 

  appledoc与doxygen均会将单行的“///”注释识别为简要描述。兼容性非常高。

  备注——
1) 文本最好统一以英文句号(.)结尾。这样做有助于代码阅读,明确地得知该段文本已经结束,而且有助于避免乱码时的换行符丢失问题。
2) 不要连续多行使用“///”。doxygen在默认情况下,会将多行的“///”当作详细描述,而没有简要注释. 虽然可以修改doxygen的配置以解决上述问题,但多行“///”本身是违背“简要描述”这个初衷的.

1.1.2 多行注释

  当需要写详细描述时,这时就需要使用多行注释了。推荐格式为——

/** 简要描述.
 *
 * 详细描述或其他.
 */

 

  对于appledoc与使用了JAVADOC_AUTOBRIEF参数的doxygen来说,它们均会将注释中的第一段识别为简要描述,然后将后面的段识别为详细描述.

  其实doxygen的标准多行注释为——

/**
 * @brief 简要描述.
 *
 * 详细描述或其他.
 */

 

  可惜appledoc对@brief指令的支持存在缺陷——@brief不能出现类、协议的注释中,会导致后续内容丢失。 @brief多行注释仅能安全的用在属性、方法的注释中。

  备注——
1) 多行注释存在“段”的概念,以内容为空的行作为分段依据。如果没有空行隔开的话,会将连续有内容的行连接起来组成一段.
2) 如果省略中间各行行首的星号(*),appledoc与doxygen也能识别。当考虑到注释缩进、美观性、兼容性,还是建议不要省略行首星号。

1.1.3 行尾注释(仅doxygen)

  在对枚举、结构体等类型的成员进行注释时,为了使内容更加紧凑,我们一般喜欢在行尾写注释。
  可惜目前仅有doxygen支持行尾注释,而appledoc不支持。

  doxygen支持以下4种行尾注释——

/**< 行尾注释1. appledoc不支持会变为下一项的注释, doxygen 支持, 根据英文句号自动切分简要描述与详细描述. */
/*!< 行尾注释2. appledoc不支持会变为下一项的注释, doxygen 支持, 会全部当作详细描述, 而缺少简要描述. */
///< 行尾注释3. appledoc不支持会变为下一项的注释, doxygen 支持.
//!< 行尾注释4. appledoc不支持会会忽略, doxygen 支持.

 

  为了避免appledoc误将行尾注释当作下一项的注释,故推荐第4种注释——既以“//!<”开头的注释。


1.2 类(协议、分类)的注释

  对于类(协议、分类)来说,一般只需要写简要描述就行了,这时可以使用单行注释——

/// 文档A.
@interface DocA : NSObject

 

  当需要留下详细描述时,可换成多行注释——

/** 文档B.
 *
 * 文档B的详细描述.
 */
@interface DocB : NSObject

 


1.3 属性的注释

  对于属性来说,本来使用行尾注释是最好的,能使内容更加紧凑。可惜目前appledoc不支持行尾注释。只好退而求其次,选择单行注释了——

/// 数值属性.
@property (nonatomic,assign) NSInteger num;

 

  当需要留下详细描述时,可换成多行注释——

/**
 * @brief 字符串属性.
 *
 * 属性的详细描述.
 */
@property (nonatomic,strong) NSString* str;

 


1.4 方法的注释

  对于没有参数、返回值的简单方法,可以使用单行注释——

/// 简单方法.
- (void)someMethod;

 

  若方法具有参数或返回值,这时就得使用多行注释了——

/**
 * @brief 带整数参数的方法.
 *
 * @param  value 值.
 *
 * @return 返回value.
 */
- (int)someMethodByInt:(int)value;

 

  指令说明——
@param : 参数描述.
@return : 返回值描述.

  由于方法注释需要填写的内容较多(参数列表与返回值等),所以现在有很多插件可以帮忙生成方法的注释,而这些插件一般是使用@brief多行注释的。例如参考文献中的《Xcode4快速Doxygen文档注释 — 简明图文教程(3分钟后爽歪歪)》.

  在某些时候,我们还需要在方法注释种填写异常、参见、警告 等信息——

/**
 * @brief 带字符串参数的方法.
 *
 * @param  value 值.
 *
 * @return 返回value.
 *
 * @exception NSException 可能抛出的异常.
 *
 * @see someMethod
 * @see someMethodByInt:
 * @warning 警告: appledoc中显示为蓝色背景, Doxygen中显示为红色竖条.
 * @bug 缺陷: appledoc中显示为黄色背景, Doxygen中显示为绿色竖条.
 */
- (NSString*)someMethodByStr:(NSString*)value;

 

  指令说明——
@exception : 异常描述.
@see : 参见. 具体用法详见 1.5.2 @see、@sa(参见) .
@warning : 警告.
@bug : 警告.


1.5 appledoc、doxygen均支持的指令

  指令一般以“@”开头,也可以使用“\”等符号开头。 若想在文本中使用“@”、“\”等符号,可使用“\”转义符,例如“\@”、“\\”等。

1.5.1 指令列表

  指令在appledoc中被称作“Directive”,而在doxygen中被称作“Command”。
  appledoc没有专门指令参考文档,仅在《Comments formatting style》中给了几个简单示例。
  而doxygen有详细的指令参考文档,详见《Special Commands》。

  经过测试,我发现下列指令在appledoc与doxygen中均是有效的——
@brief : 简要注释. appledoc中仅对属性、方法有效,对类、协议 无效,会造成后续内容解析失败.<br>@param <name> <description>: 参数描述.<br>@return <description>: 返回值描述.<br>@exception <name> <description>: 异常描述.<br>@see <name>: 参见.<br>@sa <name>: 参见. 同@see.<br>@warning <text>: 警告.<br>@bug <text>: 警告.<br>@name <title>: 组名. 用于给成员们分组, 既文档中Tasks区的子类别.</p> <h3><br>1.5.2 @see、@sa(参见)</h3> <p>  参见指令的格式为——<br>@see <name><br>@sa <name></p> <p>  在保证appledoc与doxygen均兼容的情况下,<name>可为——<br>1) 当前类(或协议)中的属性或方法。(注意Objective-C方法签名的写法,一般为“方法名:参数1:参数2:⋯⋯”的格式)<br>2) 类(或协议)名。(注意appledoc不支持当前类)</p> <p>  虽然appledoc与doxygen都支持参见“其他类或协议中的成员”,可惜它们的写法不同,而且相互不兼容——<br>appledoc:使用Objective-C消息语法,既“[类 成员]”格式。<br>doxygen:使用传统的对象成员访问语法,既“类.成员”格式。</p> <p>  注意本指令与@brief指令存在同样的问题——appledoc中仅对属性、方法有效,对类、协议 无效,会造成后续内容解析失败。 这时有两种处理策略——<br>1) 将参见指令放在注释的最后面,避免内容丢失,且能保证在doxygen中的效果.<br>2) 使用链接来代替参见。详见 1.6.4 链接。</p> <h2><br>1.6 appledoc、doxygen均支持的排版格式</h2> <p>  无格式的纯文本看起来比较费劲,得进行格式排版,以提高文档的组织性与表现力。appledoc与doxygen均有自己的一套约定——<br>appledoc可参考《Comments formatting style》。<br>doxygen可参考《Markdown support》。</p> <p>  本节将会介绍appledoc与doxygen均支持的排版格式。</p> <h3>1.6.1 代码文本</h3> <p>  有时需要在一段话中引入一小段代码,这时可以用重音符(`)将那一段代码给包起来。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 引用短代码, 如 `someMethodByStr:` . </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h3><br>1.6.2 代码块</h3> <p>  代码块适用于需要在注释中放置多行代码的情况。具体办法是在每行内容的前面加一个tab字符,例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 示例代码: * * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p> </p> <p>  因为空格与Tab字符均显示为空白,不易区分。于是用<space>、<tab>表达空格与tab字符,上述注释实际为——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* <space>*<space>示例代码: <space>* <space>*<space><tab>int sum=0; <space>*<space><tab>for(int i=1; i<=10; ++i) { <space>*<space><tab><tab>sum += i; <space>*<space><tab>} <space></span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  因每行注释开始的星号(*)与内容之间必须用空白型字符隔开,所以平时用空格或tab字符都行。但在使用代码块时,为了避免对Tab字符的误判,内容最好严格以“<space><tab>”开头(既每行以“<space>*<space><tab>”开头)。</p> <p>  备注——<br>1) 注意段的概念,代码块与前后文本之间应该空开一行。<br>2) appledoc与doxygen还支持将4个空格当作一个tab字符。但4个字符的录入、维护起来会更费力一些,不推荐使用。</p> <h4>1.6.2.1 xcode中输入代码块</h4> <p>  在xcode中,按下Tab键时,会自动整合前面的空格字符,导致代码块排版失效。所以建议先在多行注释中粘贴代码,然后在行前输入“*<space><tab>”。范例如下——</p> <p>  首先,最初的注释是这样的——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  第一步,在多行注释中粘贴代码,注意xcode会自动对新粘贴内容进行排版,在每一行的前面加一个空格——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. int sum=0; for(int i=1; i<=10; ++i) { sum += i; } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  第二步,补齐行首。复制“*<space><tab>”,对于先前所粘贴的那段代码,在每一行的第二个字符处粘贴,以形成“<space>*<space><tab>”开头的代码块格式——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  第三步,修尾。增加空行,增加“代码:”行,提示下面是代码——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. * * 代码: * * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h3><br>1.6.3 列表</h3> <h4>1.6.3.1 无序列表</h4> <p>  在内容的每一行开头使用“-”、“+”或“*”字符,可创建无序列表。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 无序列表: * * - abc * - xyz * - rgb </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4>1.6.3.2 有序列表</h4> <p>  使用数字与小数点,可创建有序列表。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 有序列表: * * 1. first. * 2. second. * 3. third. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4>1.6.3.3 多级列表</h4> <p>  使用tab字符配合使用无序列表或多级列表,可创建多级列表。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 多级列表: * * - xyz * - x * - y * - z * - rgb * - red * 1. first. * 1. alpha. * 2. beta. * 2. second. * 3. third. * - green * - blue </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4><br>1.6.4 链接</h4> <p>  链接有三种形式——<br>1) 直接链接。格式为 <link>。会将链接地址直接作为文本来显示。<br>2) 文本链接。格式为 [text](<link>)。使用自定义的文本作为链接名。<br>3) 交叉引用链接。比较复杂,且难以兼容appledoc与doxygen,故本文不讨论。</p> <h4>1.6.4.1 Url</h4> <p>  在注释中直接写上url便会自动创建链接,例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> : 直接写url链接. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  还可以使用文本链接形式——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * [Doxygen](</span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/) : 为链接提供文本 . </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4>1.6.4.2 类与协议</h4> <p>  在注释中直接写上类(或协议)名,并注意左右两侧留空格,appledoc与doxygen便会自动生成指向该类(或协议)的链接。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * DocA : 类. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  但对于文本链接来说,appledoc与doxygen的写法不同——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * - [文档B](DocB) : 类的链接文本.(仅appledoc) * - [文档B](@ref DocB) : 为\@ref链接提供文本 (仅doxygen. appledoc会把\@ref当作文本而生成错误的链接). </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  建议还是使用直接链接吧。</p> <h4>1.6.4.3 属性与方法(仅appledoc)</h4> <p>  如果注释中出现了 [类 成员],appledoc会自动的为其创建链接,但doxygen不支持此功能。</p> <p>  如果注释中出现当前类的属性或方法名,appledoc会自动的为其创建链接,但doxygen不支持此功能。而且appledoc还存在Bug——如果在同一片注释中出现了[类 成员],那么当前类的的属性或方法的链接会失效。</p> <p>  这么不稳定的功能还是暂时别用吧。</p> <h2><br>1.7 常用的doxygen注释示例</h2> <p>  doxygen的注释功能多的令人眼花缭乱,这里还是介绍几种常用写法吧。</p> <h3>1.7.1 文件头</h3> <p>  一般格式为——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @file MyDocViewController.h * @brief 主页面. * @author [zyl910](</span><span style="color: #008000; text-decoration: underline;">http://www.cnblogs.com/zyl910/</span><span style="color: #008000;">) * @version 1.0 * @date 2013-06-07 * * # update (更新日志) * * [2013-06-07] <zyl910> v1.0 * * + v1.0版发布. * </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  指令说明——<br>@file [<name>]:文件名.<br>@author <list of authors>:作者. 这里我使用了链接,详见 1.6.4 链接 .<br>@version <version number>:版本号.<br>@date <date description>:日期.</p> <p>  以井号(#)开头的行表示是标题。如果有1个井号(#),表示是一级标题。如果有2个井号(##),表示是二级标题,以此类推。</p> <h2>1.7.2 枚举、结构体、联合体与typedef</h2> <p>  对于枚举、结构体、联合体等类型,一般可选用单行注释或多行注释。对于其中的成员,推荐使用行尾注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #808080;">///</span><span style="color: #008000;"> Objective-C 文档工具枚举 (枚举, 仅Doxygen).</span> typedef <span style="color: #0000ff;">enum</span><span style="color: #000000;"> _ObjCDocToolEnum{ ObjCDocToolEnumAppleDoc </span>= <span style="color: #800080;">1</span>, <span style="color: #008000;">//</span><span style="color: #008000;">!< AppleDoc. </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> .</span> ObjCDocToolEnumDoxygen, <span style="color: #008000;">//</span><span style="color: #008000;">!< Doxygen. </span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/ .</span> <span style="color: #000000;">}ObjCDocToolEnum; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 整数矩形 (结构体, 仅Doxygen). * * 结构体的详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> _RectInt { </span><span style="color: #0000ff;">int</span> x; <span style="color: #008000;">//</span><span style="color: #008000;">!< 横坐标.</span> <span style="color: #0000ff;">int</span> y; <span style="color: #008000;">//</span><span style="color: #008000;">!< 纵坐标.</span> <span style="color: #0000ff;">int</span> width; <span style="color: #008000;">//</span><span style="color: #008000;">!< 宽度.</span> <span style="color: #0000ff;">int</span> height; <span style="color: #008000;">//</span><span style="color: #008000;">!< 高度.</span> }RectInt, *PRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的指针.</span> typedef <span style="color: #0000ff;">const</span> RectInt* PCRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的常量指针.</span> <span style="color: #808080;">///</span><span style="color: #008000;"> 浮点数的字节(联合体, 仅Doxygen).</span> <span style="color: #000000;">typedef union _FloatByte { </span><span style="color: #0000ff;">float</span> f; <span style="color: #008000;">//</span><span style="color: #008000;">!< 单精度浮点数.</span> unsigned <span style="color: #0000ff;">char</span> bytes[<span style="color: #800080;">4</span>]; <span style="color: #008000;">//</span><span style="color: #008000;">!< 4个字节.</span> } FloatByte;</pre> </div> <p>   注意行尾注释是对前一项的注释,所以一定要使用分号(;)或逗号(,)标明本项成员定义好后,再写行尾注释。包括最后一个成员。</p> <p>  在定义结构体时,一般还需要定义其相关的指针类型与常量指针类型——<br>定义指针类型时,可以跟结构体的定义写在一起,利用行尾注释的特点来注释。<br>定义常量指针类型时,需要单独写一行typedef,并使用行尾注释。</p> <h3><br>1.7.3 宏</h3> <p>  对于常量形式的简单宏,推荐使用行尾注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">#define</span> BUFSIZE 100 <span style="color: #008000;">//</span><span style="color: #008000;">!< 缓冲区大小 (简单宏, 仅Doxygen).</span></pre> </div> <p> </p> <p>  对于带参数的宏,可参考“方法的注释”写多行注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 最小值 (参数宏, 仅Doxygen). * * @param a 值a. * @param b 值b. * * @return 返回两者中的最小值. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">#define</span> min(a,b) ( ((a)<(b)) ? (a) : (b) )</pre> </div> <p> </p> <h3><br>1.7.4 函数指针与块函数(Block Objects)</h3> <p>  对于函数指针与块函数,也可参考“方法的注释”写多行注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作回调函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (*ActionCallback)(<span style="color: #0000ff;">void</span>* sender, <span style="color: #0000ff;">void</span>*<span style="color: #000000;"> userdata); </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作块函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (^ActionHandler)(<span style="color: #0000ff;">id</span> sender, <span style="color: #0000ff;">id</span> userdata);</pre> </div> <p> </p> <h3>1.7.5 成员变量</h3> <p>  对于成员变量,推荐使用行尾注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">@interface</span><span style="color: #000000;"> MyDocViewController : UIViewController { </span><span style="color: #0000ff;">@private</span> <span style="color: #0000ff;">int</span> _privateInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 私有成员变量 (仅Doxygen具有EXTRACT_PRIVATE标识时, 会被归类为“Private 属性”).</span> <span style="color: #0000ff;">@protected</span> <span style="color: #0000ff;">int</span> _protectedInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< protected成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">id</span><MyDocDelegate> _delegate; <span style="color: #008000;">//</span><span style="color: #008000;">!< 委托变量.</span> <span style="color: #000000;"> @package </span><span style="color: #0000ff;">int</span> _packageInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 包内成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">@public</span> <span style="color: #0000ff;">int</span> _publicInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 公开成员变量 (仅Doxygen, 会被归类为“Public 属性”).</span> }</pre> </div> <p> </p> <h2><br>二、编码演练</h2> <p>  前面说了很多理论知识,现在创建一个项目来演练一下吧。</p> <p>  打开Xcode,新建一个名为“MyDoc”的“Single View Application”的iOS项目。<br><a href="http://img.e-com-net.com/image/info8/e08a3f901a794fcaaa8724297717e156.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e08a3f901a794fcaaa8724297717e156.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第1张图片" width="650" height="439" style="border:1px solid black;"></a></p> <p>  然后打开MyDocViewController.h,在里面练习注释。<br>  全部代码——</p> <div class="cnblogs_code"> <img id="code_img_closed_77c22d87-0979-4df0-a1bb-0ea9c43d9372" class="code_img_closed" src="http://img.e-com-net.com/image/info8/2b246dbcfe82488397e9aa432bbc4e31.gif" alt="" width="0" height="0"> <img id="code_img_opened_77c22d87-0979-4df0-a1bb-0ea9c43d9372" class="code_img_opened" style="display: none;" src="http://img.e-com-net.com/image/info8/118a089070624154b4c3dd9bad0bd075.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_77c22d87-0979-4df0-a1bb-0ea9c43d9372" class="cnblogs_code_hide"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @file MyDocViewController.h * @brief 主页面. * @author [zyl910](</span><span style="color: #008000; text-decoration: underline;">http://www.cnblogs.com/zyl910/</span><span style="color: #008000;">) * @version 1.0 * @date 2013-06-07 * * # update (更新日志) * * [2013-06-07] <zyl910> v1.0 * * + v1.0版发布. * </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">#import</span> <UIKit/UIKit.h> <span style="color: #0000ff;">#define</span> BUFSIZE 100 <span style="color: #008000;">//</span><span style="color: #008000;">!< 缓冲区大小 (简单宏, 仅Doxygen).</span> <span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 最小值 (参数宏, 仅Doxygen). * * @param a 值a. * @param b 值b. * * @return 返回两者中的最小值. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">#define</span> min(a,b) ( ((a)<(b)) ? (a) : (b) ) <span style="color: #808080;">///</span><span style="color: #008000;"> Objective-C 文档工具枚举 (枚举, 仅Doxygen).</span> typedef <span style="color: #0000ff;">enum</span><span style="color: #000000;"> _ObjCDocToolEnum{ ObjCDocToolEnumAppleDoc </span>= <span style="color: #800080;">1</span>, <span style="color: #008000;">//</span><span style="color: #008000;">!< AppleDoc. </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> .</span> ObjCDocToolEnumDoxygen, <span style="color: #008000;">//</span><span style="color: #008000;">!< Doxygen. </span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/ .</span> <span style="color: #000000;">}ObjCDocToolEnum; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 整数矩形 (结构体, 仅Doxygen). * * 结构体的详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> _RectInt { </span><span style="color: #0000ff;">int</span> x; <span style="color: #008000;">//</span><span style="color: #008000;">!< 横坐标.</span> <span style="color: #0000ff;">int</span> y; <span style="color: #008000;">//</span><span style="color: #008000;">!< 纵坐标.</span> <span style="color: #0000ff;">int</span> width; <span style="color: #008000;">//</span><span style="color: #008000;">!< 宽度.</span> <span style="color: #0000ff;">int</span> height; <span style="color: #008000;">//</span><span style="color: #008000;">!< 高度.</span> }RectInt, *PRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的指针.</span> typedef <span style="color: #0000ff;">const</span> RectInt* PCRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的常量指针.</span> <span style="color: #808080;">///</span><span style="color: #008000;"> 浮点数的字节(联合体, 仅Doxygen).</span> <span style="color: #000000;">typedef union _FloatByte { </span><span style="color: #0000ff;">float</span> f; <span style="color: #008000;">//</span><span style="color: #008000;">!< 单精度浮点数.</span> unsigned <span style="color: #0000ff;">char</span> bytes[<span style="color: #800080;">4</span>]; <span style="color: #008000;">//</span><span style="color: #008000;">!< 4个字节.</span> <span style="color: #000000;">} FloatByte; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作回调函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (*ActionCallback)(<span style="color: #0000ff;">void</span>* sender, <span style="color: #0000ff;">void</span>*<span style="color: #000000;"> userdata); </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作块函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (^ActionHandler)(<span style="color: #0000ff;">id</span> sender, <span style="color: #0000ff;">id</span><span style="color: #000000;"> userdata); </span><span style="color: #808080;">///</span><span style="color: #008000;"> 文档A.</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> DocA : NSObject </span><span style="color: #0000ff;">@end</span><span style="color: #000000;">; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 文档B. * * 文档B的详细描述. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> DocB : NSObject </span><span style="color: #0000ff;">@end</span><span style="color: #000000;">; </span><span style="color: #808080;">///</span><span style="color: #008000;"> Objective-C 文档委托.</span> <span style="color: #0000ff;">@protocol</span> MyDocDelegate <NSObject> <span style="color: #0000ff;">@end</span> <span style="color: #008000;">/*</span><span style="color: #008000;">* 主页面. * * 主页面的详细描述. * * 引用短代码, 如 `someMethodByStr:` . * * 示例代码: * * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } * * 无序列表: * * - abc * - xyz * - rgb * * 有序列表: * * 1. first. * 2. second. * 3. third. * * 多级列表: * * - xyz * - x * - y * - z * - rgb * - red * 1. first. * 1. alpha. * 2. beta. * 2. second. * 3. third. * - green * - blue * * 以下是仅doxygen可见内容. 因为appledoc不支持类型注释中的\@see标签(但支持在属性、方法中使用),会导致后续内容丢弃. * * @see str * @see someMethodByStr: * @see MyDocAppDelegate * @see [MyDocAppDelegate window] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see [MyDocAppDelegate someMethodByFloat:] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see MyDocAppDelegate.window // 仅 doxygen. appledoc仅能识别出左边的类名. * @see MyDocAppDelegate.someMethodByFloat: // 仅 doxygen. appledoc仅能识别出左边的类名. * * end. * </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> MyDocViewController : UIViewController { </span><span style="color: #0000ff;">@private</span> <span style="color: #0000ff;">int</span> _privateInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 私有成员变量 (仅Doxygen具有EXTRACT_PRIVATE标识时, 会被归类为“Private 属性”).</span> <span style="color: #0000ff;">@protected</span> <span style="color: #0000ff;">int</span> _protectedInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< protected成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">id</span><MyDocDelegate> _delegate; <span style="color: #008000;">//</span><span style="color: #008000;">!< 委托变量.</span> <span style="color: #000000;"> @package </span><span style="color: #0000ff;">int</span> _packageInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 包内成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">@public</span> <span style="color: #0000ff;">int</span> _publicInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 公开成员变量 (仅Doxygen, 会被归类为“Public 属性”).</span> <span style="color: #000000;">} </span><span style="color: #0000ff;">#pragma</span> mark - property <span style="color: #808080;">///</span><span style="color: #008000;"> 数值属性.</span> <span style="color: #000000;">@property (nonatomic,assign) NSInteger num; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 字符串属性. * * 属性的详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> str; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试行尾注释.</span> @property (nonatomic,strong) NSString* strend1; <span style="color: #008000;">/*</span><span style="color: #008000;">*< 行尾注释1. appledoc不支持会变为下一项的注释, doxygen 支持, 根据英文句号自动切分详细描述与详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>* strend2; <span style="color: #008000;">/*</span><span style="color: #008000;">!< 行尾注释2. appledoc不支持会变为下一项的注释, doxygen 支持, 会全部当作详细描述, 而缺少详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>* strend3; <span style="color: #808080;">///</span><span style="color: #808080;">< 行尾注释3. appledoc不支持会变为下一项的注释, doxygen 支持. </span><span style="color: #008000;">@property (nonatomic,strong) NSString* strend4; //!</span><span style="color: #808080;">< 行尾注释4. appledoc不支持会会忽略, doxygen 支持. </span><span style="color: #008000;">@property (nonatomic,assign) int dummy; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 枚举的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) ObjCDocToolEnum docTool; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 结构体的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) RectInt rectInt; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 结构体常量指针的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) PCRectInt prectInt; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 联合体的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) FloatByte floatByte; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 委托.</span> @property (nonatomic, strong) <span style="color: #0000ff;">id</span><MyDocDelegate> <span style="color: #0000ff;">delegate</span><span style="color: #000000;">; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 链接测试. * * 链接: * * - </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> : 直接写url链接. * - [Doxygen](</span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/) : 为链接提供文本 . * - MyDocDelegate : 接口. * - DocA : 类. * - [文档B](DocB) : 类的链接文本.(仅appledoc) * - [文档B](@ref DocB) : 为\@ref链接提供文本 (仅doxygen. appledoc会把\@ref当作文本而生成错误的链接). * - @ref DocB : \@ref链接 (仅doxygen. appledoc会把\@ref当作文本). * * @see str * @see someMethodByStr: * @see MyDocAppDelegate * @see [MyDocAppDelegate window] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see [MyDocAppDelegate someMethodByFloat:] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see MyDocAppDelegate.window // 仅 doxygen. appledoc仅能识别出左边的类名. * @see MyDocAppDelegate.someMethodByFloat: // 仅 doxygen. appledoc仅能识别出左边的类名. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alink; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 本地链接测试1 (仅appledoc). * * 链接: * * - str : 自身属性. * - someMethodByStr: : 自身方法. * - MyDocViewController : 自身类. // appledoc无法识别. * - MyDocAppDelegate : 外部类. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alinklocal1; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 本地链接测试2 (仅appledoc). * * 只要出现了 \[ 类 成员 \] 形式的链接, 本地链接便会实效. * * 链接: * * - str : 自身属性. * - someMethodByStr: : 自身方法. * - MyDocViewController : 自身类. // appledoc无法识别. * - MyDocAppDelegate : 外部类. * - [MyDocViewController str] : 自身属性. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alinklocal2; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 本地链接测试3 (仅appledoc). * * 只要出现了 \[ 类 成员 \] 形式的链接, 本地链接便会实效. * * 链接: * * - str : 自身属性. * - someMethodByStr: : 自身方法. * - MyDocViewController : 自身类. // appledoc无法识别. * - MyDocAppDelegate : 外部类. * - [MyDocAppDelegate window] : 外部类属性. * - [MyDocAppDelegate someMethodByFloat:] : 外部类方法. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alinklocal3; </span><span style="color: #0000ff;">#pragma</span> mark - method <span style="color: #808080;">///</span><span style="color: #008000;"> 简单方法.</span> - (<span style="color: #0000ff;">void</span><span style="color: #000000;">)someMethod; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 带整数参数的方法. * * @param value 值. * * @return 返回value. </span><span style="color: #008000;">*/</span> - (<span style="color: #0000ff;">int</span>)someMethodByInt:(<span style="color: #0000ff;">int</span><span style="color: #000000;">)value; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 带字符串参数的方法. * * @param value 值. * * @return 返回value. * * @exception NSException 可能抛出的异常. * * @see someMethod * @see someMethodByInt: * @warning 警告: appledoc中显示为蓝色背景, Doxygen中显示为红色竖条. * @bug 缺陷: appledoc中显示为黄色背景, Doxygen中显示为绿色竖条. </span><span style="color: #008000;">*/</span> - (NSString*)someMethodByStr:(NSString*<span style="color: #000000;">)value; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 取得静态变量值的类方法. * * @return 返回_classInt静态变量的值. </span><span style="color: #008000;">*/</span> + (<span style="color: #0000ff;">int</span><span style="color: #000000;">)classInt; </span><span style="color: #0000ff;">@end</span> <span style="color: #808080;">///</span><span style="color: #008000;"> 主页面的动作相关操作.</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> MyDocViewController (Action) </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 调用动作回调函数 * * @param sender 发送者. * @param userdata 自定义数据. * @param handler 处理函数. * * @see callActionHandler:userdata:handler: </span><span style="color: #008000;">*/</span> - (<span style="color: #0000ff;">void</span>)callActionCallback:(<span style="color: #0000ff;">void</span>*)sender userdata:(<span style="color: #0000ff;">void</span>*<span style="color: #000000;">)userdata handler:(ActionCallback)handler; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 调用动作块函数. * * @param sender 发送者. * @param userdata 自定义数据. * @param handler 处理函数. * * @see callActionCallback:userdata:handler: </span><span style="color: #008000;">*/</span> - (<span style="color: #0000ff;">void</span>)callActionHandler:(<span style="color: #0000ff;">id</span>)sender userdata:(<span style="color: #0000ff;">id</span><span style="color: #000000;">)userdata handler:(ActionHandler)handler; </span><span style="color: #0000ff;">@end</span></pre> </div> <span class="cnblogs_code_collapse">MyDocViewController.h</span> </div> <p> </p> <p>  代码写好后,便可以使用appledoc或doxygen生成文档了,详见下面两章。</p> <h1>三、使用appledoc生成文档(docset、html)</h1> <h2>3.1 安装appledoc</h2> <p>  安装appledoc十分简单。打开终端,输入以下命令——</p> <div class="cnblogs_code"> <pre>git clone git:<span style="color: #008000;">//</span><span style="color: #008000;">github.com/tomaz/appledoc.git</span> <span style="color: #000000;">cd appledoc </span><span style="color: #0000ff;">sudo</span> <span style="color: #0000ff;">sh</span> <span style="color: #0000ff;">install</span>-appledoc.<span style="color: #0000ff;">sh</span></pre> </div> <p> </p> <h2>3.2 生成docset</h2> <p>  对于最新版本的appledoc来说,它默认时是生成docset文档并集成到xcode。<br>  在终端中使用cd命令进入项目的文件夹,然后执行下列命令——</p> <div class="cnblogs_code"> <pre>appledoc --output ./doc --project-name objcdoc --project-company <span style="color: #800000;">"</span><span style="color: #800000;">zyl910</span><span style="color: #800000;">"</span> --company-<span style="color: #0000ff;">id</span> <span style="color: #800000;">"</span><span style="color: #800000;">cn.com.zyl910</span><span style="color: #800000;">"</span> .</pre> </div> <p>  注——<br>--output ./doc:设置输出目录为“./doc”。<br>--project-name objcdoc:设置项目名为“objcdoc”。<br>--project-company "zyl910":设置公司名为“zyl910”。<br>--company-id "cn.com.zyl910":设置公司id为“cn.com.zyl910”。<br>.:当前目录。<br><a href="http://img.e-com-net.com/image/info8/0a61bb643a9d43afb3fcf0ca8d3768c0.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/0a61bb643a9d43afb3fcf0ca8d3768c0.png" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第2张图片" width="587" height="368" style="border:1px solid black;"></a></p> <p>  当该命令完成后,打开xcode中的Organizer - Documentation,会发现其中新增了帮助文档——<br><a href="http://img.e-com-net.com/image/info8/137376fa3eea4bf592643a0c23097095.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/137376fa3eea4bf592643a0c23097095.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第3张图片" width="650" height="408" style="border:1px solid black;"></a></p> <h2><br>3.3 生成html</h2> <p>  当需要html文档时,可以加上“--no-create-docset”——</p> <div class="cnblogs_code"> <pre>appledoc --no-create-docset --output ./doc --project-name objcdoc --project-company <span style="color: #800000;">"</span><span style="color: #800000;">zyl910</span><span style="color: #800000;">"</span> --company-<span style="color: #0000ff;">id</span> <span style="color: #800000;">"</span><span style="color: #800000;">cn.com.zyl910</span><span style="color: #800000;">"</span> .</pre> </div> <p><a href="http://img.e-com-net.com/image/info8/160564ca88014268bda6714155184e8e.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/160564ca88014268bda6714155184e8e.png" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第4张图片" width="587" height="368" style="border:1px solid black;"></a></p> <p>  当该命令完成后,使用浏览器打开doc/html/index.html——<br><a href="http://img.e-com-net.com/image/info8/b8b25bbc11e14df19111e3caa692811c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b8b25bbc11e14df19111e3caa692811c.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第5张图片" width="650" height="504" style="border:1px solid black;"></a></p> <h1>四、使用doxygen生成文档(html、pdf)</h1> <h2>4.1 安装doxygen</h2> <p>  doxygen支持源码编译安装与dmg安装。想省事的话,可以选择dmg安装。去doxygen官网(http://www.stack.nl/~dimitri/doxygen/download.html)下载最新的dmg。<br>  dmg下载下来后,双击加载dmg,然后把.app文件拖入应用程序文件夹,便完成了安装。</p> <h2>4.2 生成html</h2> <p>  doxygen有图形界面,可通过Launchpad打开。</p> <p>  在step 1中选择好项目的路径。<br>  step 2默认是Wizard->Project页面,在其中——<br>1) 在“Project name”中填写项目名。<br>2) 勾选“Sacn recursively”,扫描所有的子文件夹。<br>3) 在“Destination directory”中填写好文档的输出目录。这里我填的是“docs”。<br><a href="http://img.e-com-net.com/image/info8/521d012af30746ddb441e48b0583a0bb.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/521d012af30746ddb441e48b0583a0bb.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第6张图片" width="650" height="507" style="border:1px solid black;"></a></p> <p>  点击中间的“Expert”切换Expert->Project页面,在其中——<br>1) 将“OUTPUT_LANGUAGE”设为“Chinese”,使用简体中文。<br>2) 勾选“JAVADOC_AUTOBRIEF”,自动将注释的第1段识别为简要描述。<br><a href="http://img.e-com-net.com/image/info8/52b6e69ee97f4cd290ebc866737ee608.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/52b6e69ee97f4cd290ebc866737ee608.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第7张图片" width="650" height="507" style="border:1px solid black;"></a><br><a href="http://img.e-com-net.com/image/info8/2bc305e5b8ee46d7a9ba9c1d4bf9ca45.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2bc305e5b8ee46d7a9ba9c1d4bf9ca45.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第8张图片" width="650" height="507" style="border:1px solid black;"></a></p> <p>  点击中间的“Run”切换Run页面,然后点击“Run doxygen”按钮生成文档。<br><a href="http://img.e-com-net.com/image/info8/7762e3f221204888936673152aa8af54.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/7762e3f221204888936673152aa8af54.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第9张图片" width="650" height="507" style="border:1px solid black;"></a></p> <p>  当文档生成完毕后,使用浏览器打开docs/html/index.html——<br><a href="http://img.e-com-net.com/image/info8/72709f221738481b919570f2bf870b03.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/72709f221738481b919570f2bf870b03.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第10张图片" width="650" height="504" style="border:1px solid black;"></a></p> <h2><br>4.3 生成pdf</h2> <p>  doxygen默认会为生成pdf做好准备。切换到Wizard->Project,会发现它自动勾选了“LaTex”与“as intermediate format for hyperlinked PDF”。<br><a href="http://img.e-com-net.com/image/info8/2c9f70034a714825b5085e060d2e05ff.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2c9f70034a714825b5085e060d2e05ff.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第11张图片" width="650" height="507" style="border:1px solid black;"></a><br>  doxygen本身并不能直接输出pdf文件,而是生成了latex目录,其中有一个 makefile 文件。若系统中装好了pdflatex,可在latex目录中运行“make”命令来生成pdf文件。<br>  怎样才能装好pdflatex呢?mac平台可安装MacTeX。打开 http://www.tug.org/mactex/ ,下载  MacTeX.pkg (约2.1GB)。MacTeX.pkg下载好后,可双击运行,根据向导来安装。</p> <p>  环境装好之后,当在latex目录中运行“make”命令来生成pdf文件时,你会发现——纯英文文档能顺利生成pdf;而含有中文时,不能顺利生成pdf文件。</p> <p>  对于latex排版,doxygen其实已经做了很多准备,比如——源文件是UTF-8编码,并默认使用了utf8 package。理论上是支持多国语言的。<br>  可对于中文来说,还需要加载 CJKutf8 package,并配置好CJK环境。这才能顺利的使用中文。</p> <p>  用文本编辑器打开docxygen生成的latex目录中的refman.tex。找到“\begin{document}”这一行,将其修改为——</p> <div class="cnblogs_code"> <pre><span style="color: #000000;">\usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gbsn}</span></pre> </div> <p>  然后再找到“\end{document}”这一行,将其修改为——</p> <div class="cnblogs_code"> <pre><span style="color: #000000;">\end{CJK} \end{document}</span></pre> </div> <p>  保存并关闭refman.tex。<br>  然后打开终端,使用cd命令进入latex目录,然后执行“make”命令。<br><a href="http://img.e-com-net.com/image/info8/06cf4b0893e84f2bad7939057fa81dbe.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/06cf4b0893e84f2bad7939057fa81dbe.png" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第12张图片" width="587" height="368" style="border:1px solid black;"></a></p> <p><br>  执行完毕后后,该目录中会出现“refman.pdf”——<br><a href="http://img.e-com-net.com/image/info8/42b835de79e94c579cf5ab4f324d046e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/42b835de79e94c579cf5ab4f324d046e.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第13张图片" width="650" height="589" style="border:1px solid black;"></a></p> <p><br>参考文献——<br>[appledoc]《Comments formatting style》. Gentle Bytes. http://gentlebytes.com/appledoc-docs-comments/<br>[doxygen]《Markdown support》. doxygen. http://www.stack.nl/~dimitri/doxygen/manual/markdown.html<br>[doxygen]《Special Commands》. doxygen. http://www.stack.nl/~dimitri/doxygen/manual/commands.html<br>《Amazing Apple-like Documentation》. 2011-11-29. http://www.cocoanetics.com/2011/11/amazing-apple-like-documentation/<br>《使用Objective-C的文档生成工具:appledoc》. 唐巧, 2012-02-01. http://blog.devtang.com/blog/2012/02/01/use-appledoc-to-generate-xcode-doc/<br>《关于查看自已写的方法的“描述”(AppleDoc)》. Rainbird, 2012-11-25. http://blog.cnrainbird.com/index.php/2012/11/25/guan_yu_cha_kan_zi_yi_xie_de_fang_fa_de_miao_shu_appledoc/<br>《用Doxygen为Objective-C代码生成文档》. Seven's, 2011-11-20. http://www.dreamingwish.com/dream-2011/use-doxygen-to-generate-documentation-Objective-C-code.html<br>《Xcode4快速Doxygen文档注释 — 简明图文教程(3分钟后爽歪歪)》. chukong-inc, 2012-05-16. http://blog.chukong-inc.com/index.php/2012/05/16/xcode4_fast_doxygen/<br>《使用doxygen生成中文pdf文档》. zyl910, 2013-06-02. http://www.cnblogs.com/zyl910/archive/2013/06/02/doxygen_pdf_chinese.html</p> <p><br>源码下载—— <br>http://files.cnblogs.com/zyl910/objcdoc.zip</p> <p> </p> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1283334312556511232"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835514462770130944.htm" title="斤斤计较的婚姻到底有多难?" target="_blank">斤斤计较的婚姻到底有多难?</a> <span class="text-muted">白心之岂必有为</span> <div>很多人私聊我会问到在哪个人群当中斤斤计较的人最多?我都会回答他,一般婚姻出现问题的斤斤计较的人士会非常多,以我多年经验,在婚姻落的一塌糊涂的人当中,斤斤计较的人数占比在20~30%以上,也就是说10个婚姻出现问题的斤斤计较的人有2-3个有多不减。在婚姻出问题当中,有大量的心理不平衡的、尖酸刻薄的怨妇。在婚姻中仅斤斤计较有两种类型:第一种是物质上的,另一种是精神上的。在物质与精神上抠门已经严重的影响</div> </li> <li><a href="/article/1835514464028422144.htm" title="情绪觉察日记第37天" target="_blank">情绪觉察日记第37天</a> <span class="text-muted">露露_e800</span> <div>今天是家庭关系规划师的第二阶最后一天,慧萍老师帮我做了个案,帮我处理了埋在心底好多年的一份恐惧,并给了我深深的力量!这几天出来学习,爸妈过来婆家帮我带小孩,妈妈出于爱帮我收拾东西,并跟我先生和婆婆产生矛盾,妈妈觉得他们没有照顾好我…。今晚回家见到妈妈,我很欣赏她并赞扬她,妈妈说今晚要跟我睡我说好,当我们俩躺在床上准备睡觉的时候,我握着妈妈的手对她说:妈妈这几天辛苦你了,你看你多利害把我们的家收拾得</div> </li> <li><a href="/article/1835514335561084928.htm" title="芦花鞋一四" target="_blank">芦花鞋一四</a> <span class="text-muted">许叶晗</span> <div>又是在一个寒冷的夏日里,青铜和葵花决定今天一起去卖芦花鞋,奶奶亲手给他们做了一碗热乎乎的粥对他们说:“就靠你们两挣生活费了这碗粥赶紧趁热喝了吧!”于是青铜和葵花喝完了奶奶给她们做的粥,就准备去镇上卖卢花鞋,这回青铜和葵花穿着新的芦花鞋来到了镇上。青铜这回看到了很多人都在卖,用手势表达对葵花说:“这回有好多人在抢我们生意呢!我们必须得吆喝起来。”葵花点了点头。可是谁知他们也大声的叫,卖芦花喽!卖芦花</div> </li> <li><a href="/article/1835514307744460800.htm" title="QQ群采集助手,精准引流必备神器" target="_blank">QQ群采集助手,精准引流必备神器</a> <span class="text-muted">2401_87347160</span> <a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以</div> </li> <li><a href="/article/1835514207114719232.htm" title="关于沟通这件事,项目经理不需要每次都面对面进行" target="_blank">关于沟通这件事,项目经理不需要每次都面对面进行</a> <span class="text-muted">流程大师兄</span> <div>很多项目经理都会遇到这样的问题,项目中由于事情太多,根本没有足够的时间去召开会议,那在这种情况下如何去有效地管理项目中的利益相关者?当然,不建议电子邮件也不需要开会的话,建议可以采取下面几种方式来形成有效的沟通,这几种方式可以帮助你努力的通过各种办法来保持和各方面的联系。项目经理首先要问自己几个问题,项目中哪些利益相关者是必须要进行沟通的?可以列出项目中所有的利益相关者清单,同时也整理出项目中哪些</div> </li> <li><a href="/article/1835513803861749760.htm" title="机器学习与深度学习间关系与区别" target="_blank">机器学习与深度学习间关系与区别</a> <span class="text-muted">ℒℴѵℯ心·动ꦿ໊ོ꫞</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>一、机器学习概述定义机器学习(MachineLearning,ML)是一种通过数据驱动的方法,利用统计学和计算算法来训练模型,使计算机能够从数据中学习并自动进行预测或决策。机器学习通过分析大量数据样本,识别其中的模式和规律,从而对新的数据进行判断。其核心在于通过训练过程,让模型不断优化和提升其预测准确性。主要类型1.监督学习(SupervisedLearning)监督学习是指在训练数据集中包含输入</div> </li> <li><a href="/article/1835513701143244800.htm" title="铭刻于星(四十二)" target="_blank">铭刻于星(四十二)</a> <span class="text-muted">随风至</span> <div>69夜晚,绍敏同学做完功课后,看了眼房外,没听到动静才敢从书包的夹层里拿出那个心形纸团。折痕压得很深,都有些旧了,想来是已经写好很久了。绍敏同学慢慢地、轻轻地捏开折叠处,待到全部拆开后,又反复抚平纸张,然后仔细地一字字默看。只是开头的三个字是第一次看到,让她心漏跳了几拍。“亲爱的绍敏:从四年级的时候,我就喜欢你了,但是我一直不敢说,怕影响你学习。六年级的时候听说有人跟你表白,你接受了,我很难过,但</div> </li> <li><a href="/article/1835513570171908096.htm" title="底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说" target="_blank">底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说</a> <span class="text-muted">造命者说</span> <div>底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说我叫吴起,生于公元前440年的战国初期,正是群雄并起、天下纷争不断的时候。后人说我是军事家、政治家、改革家,是兵家代表人物。评价我一生历仕鲁、魏、楚三国,通晓兵家、法家、儒家三家思想,在内政军事上都有极高的成就。周安王二十一年(公元前381年),因变法得罪守旧贵族,被人乱箭射死。我出生在卫国一个“家累万金”的富有家庭,从年轻时候起就不甘平凡</div> </li> <li><a href="/article/1835513571501502464.htm" title="2020-01-25" target="_blank">2020-01-25</a> <span class="text-muted">晴岚85</span> <div>郑海燕坚持分享590天2020.1.24在生活中只存在两个问题。一个问题是:你知道想要达成的目标是什么,但却不知道如何才能达成;另一个问题是:你不知道你的目标是什么。前一个是行动的问题,后一个是结果的问题。通过制定具体的下一步行动,可以解决不知道如何开始行动的问题。而通过去想象结果,对结果做预估,可以解决找不着目标的问题。对于所有吸引我们注意力,想要完成的任务,你可以先想象一下,预期的结果究竟是什</div> </li> <li><a href="/article/1835513568917811200.htm" title="随笔 | 仙一般的灵气" target="_blank">随笔 | 仙一般的灵气</a> <span class="text-muted">海思沧海</span> <div>仙岛今天,我看了你全部,似乎已经进入你的世界我不知道,这是否是梦幻,还是你仙一般的灵气吸引了我也许每一个人都要有一份属于自己的追求,这样才能够符合人生的梦想,生活才能够充满着阳光与快乐我不知道,我为什么会这样的感叹,是在感叹自己的人生,还是感叹自己一直没有孜孜不倦的追求只感觉虚度了光阴,每天活在自己的梦中,活在一个不真实的世界是在逃避自己,还是在逃避周围的一切有时候我嘲笑自己,嘲笑自己如此的虚无,</div> </li> <li><a href="/article/1835513567663714304.htm" title="想家" target="_blank">想家</a> <span class="text-muted">爆米花机</span> <div>也许不同于大家对家乡的思念,我对家乡甚至是疯狂的不舍。还未踏出车站就感觉到幸福,我享受这里的夕阳、这里的浓烈柴火味、这里每一口家常菜。我是宅女,我贪恋家的安逸。刚刚踏出大学校门,初出茅庐,无法适应每年只能国庆和春节回家。我焦虑、失眠、无端发脾气,是无法适应工作的节奏,是无法接受我将一步步离开家乡的事实。我不想承认自己胸无大志,选择再次踏上征程。图片发自App</div> </li> <li><a href="/article/1835513551624695808.htm" title="【iOS】MVC设计模式" target="_blank">【iOS】MVC设计模式</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a> <div>MVC前言如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architecturalpattern),属于编程的方法论。MVC模式就是架构模式的一种。它是Apple官方推荐的App开发架构,也是一般开发者最先遇到、最经典的架构。MVC各层controller层Controller/ViewController/VC(控制器)负责协调Model和View,处理大部分逻辑它将数据从Mod</div> </li> <li><a href="/article/1835513551142350848.htm" title="OC语言多界面传值五大方式" target="_blank">OC语言多界面传值五大方式</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言在完成暑假仿写项目时,遇到了许多需要用到多界面传值的地方,这篇博客来总结一下比较常用的五种多界面传值的方式。属性传值属性传值一般用前一个界面向后一个界面传值,简单地说就是通过访问后一个视图控制器的属性来为它赋值,通过这个属性来做到从前一个界面向后一个界面传值。首先在后一个界面中定义属性@interfaceBViewController:UIViewController@propertyNSSt</div> </li> <li><a href="/article/1835513440525971456.htm" title="一百九十四章. 自相矛盾" target="_blank">一百九十四章. 自相矛盾</a> <span class="text-muted">巨木擎天</span> <div>唉!就这么一夜,林子感觉就像过了很多天似的,先是回了阳间家里,遇到了那么多不可思议的事情儿。特别是小伙伴们,第二次与自己见面时,僵硬的表情和恐怖的气氛,让自己如坐针毡,打从心眼里难受!还有东子,他现在还好吗?有没有被人欺负?护城河里的小鱼小虾们,还都在吗?水不会真的干枯了吧?那对相亲相爱漂亮的太平鸟儿,还好吧!春天了,到了做窝、下蛋、喂养小鸟宝宝的时候了,希望它们都能够平安啊!虽然没有看见家人,也</div> </li> <li><a href="/article/1835513424734416896.htm" title="UI学习——cell的复用和自定义cell" target="_blank">UI学习——cell的复用和自定义cell</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添</div> </li> <li><a href="/article/1835512920797179904.htm" title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a> <span class="text-muted">软件技术NINI</span> <a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/1.htm">vue案例</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div> </li> <li><a href="/article/1835512809883004928.htm" title="10月|愿你的青春不负梦想-读书笔记-01" target="_blank">10月|愿你的青春不负梦想-读书笔记-01</a> <span class="text-muted">Tracy的小书斋</span> <div>本书的作者是俞敏洪,大家都很熟悉他了吧。俞敏洪老师是我行业的领头羊吧,也是我事业上的偶像。本日摘录他书中第一章中的金句:『一个人如果什么目标都没有,就会浑浑噩噩,感觉生命中缺少能量。能给我们能量的,是对未来的期待。第一件事,我始终为了进步而努力。与其追寻全世界的骏马,不如种植丰美的草原,到时骏马自然会来。第二件事,我始终有阶段性的目标。什么东西能给我能量?答案是对未来的期待。』读到这里的时候,我便</div> </li> <li><a href="/article/1835512542735200256.htm" title="C语言宏函数" target="_blank">C语言宏函数</a> <span class="text-muted">南林yan</span> <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>一、什么是宏函数?通过宏定义的函数是宏函数。如下,编译器在预处理阶段会将Add(x,y)替换为((x)*(y))#defineAdd(x,y)((x)*(y))#defineAdd(x,y)((x)*(y))intmain(){inta=10;intb=20;intd=10;intc=Add(a+d,b)*2;cout<<c<<endl;//800return0;}二、为什么要使用宏函数使用宏函数</div> </li> <li><a href="/article/1835512305320816640.htm" title="地推话术,如何应对地推过程中家长的拒绝" target="_blank">地推话术,如何应对地推过程中家长的拒绝</a> <span class="text-muted">校师学</span> <div>相信校长们在做地推的时候经常遇到这种情况:市场专员反馈家长不接单,咨询师反馈难以邀约这些家长上门,校区地推疲软,招生难。为什么?仅从地推层面分析,一方面因为家长受到的信息轰炸越来越多,对信息越来越“免疫”;而另一方面地推人员的专业能力和营销话术没有提高,无法应对家长的拒绝,对有意向的家长也不知如何跟进,眼睁睁看着家长走远;对于家长的疑问,更不知道如何有技巧地回答,机会白白流失。由于回答没技巧和专业</div> </li> <li><a href="/article/1835512178023690240.htm" title="谢谢你们,爱你们!" target="_blank">谢谢你们,爱你们!</a> <span class="text-muted">鹿游儿</span> <div>昨天家人去泡温泉,二个孩子也带着去,出发前一晚,匆匆下班,赶回家和孩子一起收拾。饭后,我拿出笔和本子(上次去澳门时做手帐的本子)写下了1\2\3\4\5\6\7\8\9,让后让小壹去思考,带什么出发去旅游呢?她在对应的数字旁边画上了,泳衣、泳圈、肖恩、内衣内裤、tapuy、拖鞋……画完后,就让她自己对着这个本子,将要带的,一一带上,没想到这次带的书还是这本《便便工厂》(晚上姑婆发照片过来,妹妹累得</div> </li> <li><a href="/article/1835511911769272320.htm" title="C语言如何定义宏函数?" target="_blank">C语言如何定义宏函数?</a> <span class="text-muted">小九格物</span> <a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>在C语言中,宏函数是通过预处理器定义的,它在编译之前替换代码中的宏调用。宏函数可以模拟函数的行为,但它们不是真正的函数,因为它们在编译时不会进行类型检查,也不会分配存储空间。宏函数的定义通常使用#define指令,后面跟着宏的名称和参数列表,以及宏展开后的代码。宏函数的定义方式:1.基本宏函数:这是最简单的宏函数形式,它直接定义一个表达式。#defineSQUARE(x)((x)*(x))2.带参</div> </li> <li><a href="/article/1835511912192897024.htm" title="微服务下功能权限与数据权限的设计与实现" target="_blank">微服务下功能权限与数据权限的设计与实现</a> <span class="text-muted">nbsaas-boot</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>在微服务架构下,系统的功能权限和数据权限控制显得尤为重要。随着系统规模的扩大和微服务数量的增加,如何保证不同用户和服务之间的访问权限准确、细粒度地控制,成为设计安全策略的关键。本文将讨论如何在微服务体系中设计和实现功能权限与数据权限控制。1.功能权限与数据权限的定义功能权限:指用户或系统角色对特定功能的访问权限。通常是某个用户角色能否执行某个操作,比如查看订单、创建订单、修改用户资料等。数据权限:</div> </li> <li><a href="/article/1835511912843014144.htm" title="理解Gunicorn:Python WSGI服务器的基石" target="_blank">理解Gunicorn:Python WSGI服务器的基石</a> <span class="text-muted">范范0825</span> <a class="tag" taget="_blank" href="/search/ipython/1.htm">ipython</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico</div> </li> <li><a href="/article/1835511669476913152.htm" title="小丽成长记(四十三)" target="_blank">小丽成长记(四十三)</a> <span class="text-muted">玲玲54321</span> <div>小丽发现,即使她好不容易调整好自己的心态下一秒总会有不确定的伤脑筋的事出现,一个接一个的问题,人生就没有停下的时候,小问题不断出现。不过她今天看的书,她接受了人生就是不确定的,厉害的人就是不断创造确定性,在Ta的领域比别人多的确定性就能让自己脱颖而出,显示价值从而获得的比别人多的利益。正是这样的原因,因为从前修炼自己太少,使得她现在在人生道路上打怪起来困难重重,她似乎永远摆脱不了那种无力感,有种习</div> </li> <li><a href="/article/1835511542284644352.htm" title="学点心理知识,呵护孩子健康" target="_blank">学点心理知识,呵护孩子健康</a> <span class="text-muted">静候花开_7090</span> <div>昨天听了华中师范大学教育管理学系副教授张玲老师的《哪里才是学生心理健康的最后庇护所,超越教育与技术的思考》的讲座。今天又重新学习了一遍,收获匪浅。张玲博士也注意到了当今社会上的孩子由于心理问题导致的自残、自杀及伤害他人等恶性事件。她向我们普及了一个重要的命题,她说心理健康的一些基本命题,我们与我们通常的一些教育命题是不同的,她还举了几个例子,让我们明白我们原来以为的健康并非心理学上的健康。比如如果</div> </li> <li><a href="/article/1835511163450912768.htm" title="2021年12月19日,春蕾教育集团团建活动感受——黄晓丹" target="_blank">2021年12月19日,春蕾教育集团团建活动感受——黄晓丹</a> <span class="text-muted">黄错错加油</span> <div>感受:1.从陌生到熟悉的过程。游戏环节让我们在轻松的氛围中得到了锻炼,也增长了不少知识。2.游戏过程中,我们贡献的是个人力量,展现的是团队的力量。它磨合的往往不止是工作的熟悉,更是观念上契合度的贴近。3.这和工作是一样的道理。在各自的岗位上,每个人摆正自己的位置、各司其职充分发挥才能,并团结一致劲往一处使,才能实现最大的成功。新知:1.团队精神需要不断地创新。过去,人们把创新看作是冒风险,现在人们</div> </li> <li><a href="/article/1835511036317364224.htm" title="Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断" target="_blank">Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断</a> <span class="text-muted">尐尐呅</span> <div>结核病是艾滋病合并其他疾病中导致患者死亡的主要原因。其中结核病由结核分枝杆菌(Mycobacteriumtuberculosis,Mtb)感染引起,获得性免疫缺陷综合症(艾滋病)由人免疫缺陷病毒(Humanimmunodeficiencyvirustype1,HIV-1)感染引起。国家感染性疾病临床医学研究中心/深圳市第三人民医院张国良团队携手深圳华大生命科学研究院吴靓团队,共同研究得出单细胞测序</div> </li> <li><a href="/article/1835511030260789248.htm" title="c++ 的iostream 和 c++的stdio的区别和联系" target="_blank">c++ 的iostream 和 c++的stdio的区别和联系</a> <span class="text-muted">黄卷青灯77</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/iostream/1.htm">iostream</a><a class="tag" taget="_blank" href="/search/stdio/1.htm">stdio</a> <div>在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in</div> </li> <li><a href="/article/1835510909070569472.htm" title="瑶池防线" target="_blank">瑶池防线</a> <span class="text-muted">谜影梦蝶</span> <div>冥华虽然逃过了影梦的军队,但他是一个忠臣,他选择上报战况。败给影梦后成逃兵,高层亡尔还活着,七重天失守......随便一条,即可处死冥华。冥华自然是知道以仙界高层的习性此信一发自己必死无疑,但他还选择上报实情,因为责任。同样此信送到仙宫后,知道此事的人,大多数人都认定冥华要完了,所以上到仙界高层,下到扫大街的,包括冥华自己,全都准备好迎接冥华之死。如果仙界现在还属于两方之争的话,冥华必死无疑。然而</div> </li> <li><a href="/article/1835510656011431936.htm" title="爬山后遗症" target="_blank">爬山后遗症</a> <span class="text-muted">璃绛</span> <div>爬山,攀登,一步一步走向制高点,是一种挑战。成功抵达是一种无法言语的快乐,在山顶吹吹风,看看风景,这是从未有过的体验。然而,爬山一时爽,下山腿打颤,颠簸的路,一路向下走,腿部力量不够,走起来抖到不行,停不下来了!第二天必定腿疼,浑身酸痛,坐立难安!</div> </li> <li><a href="/article/71.htm" title="Linux的Initrd机制" target="_blank">Linux的Initrd机制</a> <span class="text-muted">被触发</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>Linux 的 initrd 技术是一个非常普遍使用的机制,linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式,变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。本文首先介绍了什么是 initrd 技术,然后分别介绍了 Linux2.4 内核和 2.6 内核的 initrd 的处理流程。最后通过对 Lin</div> </li> <li><a href="/article/198.htm" title="maven本地仓库路径修改" target="_blank">maven本地仓库路径修改</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>默认maven本地仓库路径:C:\Users\Administrator\.m2 修改maven本地仓库路径方法:     1.打开E:\maven\apache-maven-2.2.1\conf\settings.xml     2.找到        </div> </li> <li><a href="/article/325.htm" title="XSD和XML中的命名空间" target="_blank">XSD和XML中的命名空间</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/xsd/1.htm">xsd</a><a class="tag" taget="_blank" href="/search/schema/1.htm">schema</a><a class="tag" taget="_blank" href="/search/namespace/1.htm">namespace</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4/1.htm">命名空间</a> <div>http://www.360doc.com/content/12/0418/10/9437165_204585479.shtml http://blog.csdn.net/wanghuan203/article/details/9203621 http://blog.csdn.net/wanghuan203/article/details/9204337 http://www.cn</div> </li> <li><a href="/article/452.htm" title="Java 求素数运算" target="_blank">Java 求素数运算</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%B4%A0%E6%95%B0/1.htm">素数</a> <div>网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码,加以改进,效率有成倍热提高。 第一种:   原理: 6N(+-)1法         任何一个自然数,总可以表示成为如下的形式之一: 6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)   </div> </li> <li><a href="/article/579.htm" title="java 单例模式" target="_blank">java 单例模式</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>想必单例模式大家都不会陌生,有如下两种方式来实现单例模式:   class Singleton { private static Singleton instance=new Singleton(); private Singleton(){} static Singleton getInstance() { return instance; }</div> </li> <li><a href="/article/706.htm" title="Linux下Mysql源码安装" target="_blank">Linux下Mysql源码安装</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1.假设已经有mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz (1)创建mysql的安装目录及数据库存放目录       解压缩下载的源码包,目录结构,特殊指定的目录除外:           </div> </li> <li><a href="/article/833.htm" title="32位和64位操作系统" target="_blank">32位和64位操作系统</a> <span class="text-muted">墙头上一根草</span> <a class="tag" taget="_blank" href="/search/32%E4%BD%8D%E5%92%8C64%E4%BD%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">32位和64位操作系统</a> <div>32位和64位操作系统是指:CPU一次处理数据的能力是32位还是64位。现在市场上的CPU一般都是64位的,但是这些CPU并不是真正意义上的64 位CPU,里面依然保留了大部分32位的技术,只是进行了部分64位的改进。32位和64位的区别还涉及了内存的寻址方面,32位系统的最大寻址空间是2 的32次方= 4294967296(bit)= 4(GB)左右,而64位系统的最大寻址空间的寻址空间则达到了</div> </li> <li><a href="/article/960.htm" title="我的spring学习笔记10-轻量级_Spring框架" target="_blank">我的spring学习笔记10-轻量级_Spring框架</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a> <div>一、问题提问:     → 请简单介绍一下什么是轻量级?     轻量级(Leightweight)是相对于一些重量级的容器来说的,比如Spring的核心是一个轻量级的容器,Spring的核心包在文件容量上只有不到1M大小,使用Spring核心包所需要的资源也是很少的,您甚至可以在小型设备中使用Spring。  </div> </li> <li><a href="/article/1087.htm" title="mongodb 环境搭建及简单CURD" target="_blank">mongodb 环境搭建及简单CURD</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/curd/1.htm">curd</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a><a class="tag" taget="_blank" href="/search/mongo/1.htm">mongo</a> <div>一 搭建mongodb环境 1. 在mongo官网下载mongodb 2. 在本地创建目录 "D:\Program Files\mongodb-win32-i386-2.6.4\data\db" 3. 运行mongodb服务 [mongod.exe --dbpath "D:\Program Files\mongodb-win32-i386-2.6.4\data\</div> </li> <li><a href="/article/1214.htm" title="数据字典和动态视图" target="_blank">数据字典和动态视图</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%AD%97%E5%85%B8/1.htm">数据字典</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%86%E5%9B%BE/1.htm">动态视图</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E5%92%8C%E5%AF%B9%E8%B1%A1%E6%9D%83%E9%99%90/1.htm">系统和对象权限</a> <div>数据字典(data dictionary)是 Oracle 数据库的一个重要组成部分,这是一组用于记录数据库信息的只读(read-only)表。随着数据库的启动而启动,数据库关闭时数据字典也关闭   数据字典中包含   数据库中所有方案对象(schema object)的定义(包括表,视图,索引,簇,同义词,序列,过程,函数,包,触发器等等) 数据库为一</div> </li> <li><a href="/article/1341.htm" title="多线程编程一般规则" target="_blank">多线程编程一般规则</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>       如果两个工两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的,如果对象更新影响到只读方法,那么只读方法也要定义成同步的。        不要滥用同步。如果在一个对象内的不同的方法访问的不是同一个数据,就不要将方法设置为synchronized的。 </div> </li> <li><a href="/article/1468.htm" title="将文件或目录拷贝到另一个Linux系统的命令scp" target="_blank">将文件或目录拷贝到另一个Linux系统的命令scp</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/scp/1.htm">scp</a> <div>一.功能说明        scp就是security copy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下。scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下:        scp 远程用户名@IP地址:文件的绝对路径</div> </li> <li><a href="/article/1595.htm" title="【持久化框架MyBatis3五】MyBatis3一对多关联查询" target="_blank">【持久化框架MyBatis3五】MyBatis3一对多关联查询</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Mybatis3/1.htm">Mybatis3</a> <div>以教员和课程为例介绍一对多关联关系,在这里认为一个教员可以叫多门课程,而一门课程只有1个教员教,这种关系在实际中不太常见,通过教员和课程是多对多的关系。   示例数据:   地址表:   CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VAR</div> </li> <li><a href="/article/1722.htm" title="cookie状态判断引发的查找问题" target="_blank">cookie状态判断引发的查找问题</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/form/1.htm">form</a><a class="tag" taget="_blank" href="/search/cgi/1.htm">cgi</a> <div>先说一下我们的业务背景: 1.前台将图片和文本通过form表单提交到后台,图片我们都做了base64的编码,并且前台图片进行了压缩 2.form中action是一个cgi服务 3.后台cgi服务同时供PC,H5,APP 4.后台cgi中调用公共的cookie状态判断方法(公共的,大家都用,几年了没有问题) 问题:(折腾两天。。。。) 1.PC端cgi服务正常调用,cookie判断没</div> </li> <li><a href="/article/1849.htm" title="通过Nginx,Tomcat访问日志(access log)记录请求耗时" target="_blank">通过Nginx,Tomcat访问日志(access log)记录请求耗时</a> <span class="text-muted">ronin47</span> <div>一、Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 nginx.conf使用配置方式: log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_r</div> </li> <li><a href="/article/1976.htm" title="java-67- n个骰子的点数。 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。" target="_blank">java-67- n个骰子的点数。 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class ProbabilityOfDice { /** * Q67 n个骰子的点数 * 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 * 在以下求解过程中,我们把骰子看作是有序的。 * 例如当n=2时,我们认为(1,2)和(2,1)是两种不同的情况 */ private stati</div> </li> <li><a href="/article/2103.htm" title="看别人的博客,觉得心情很好" target="_blank">看别人的博客,觉得心情很好</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%E5%8D%9A%E5%AE%A2/1.htm">博客</a><a class="tag" taget="_blank" href="/search/%E5%BF%83%E6%83%85/1.htm">心情</a> <div>   以为写博客,就是总结,就和日记一样吧,同时也在督促自己。今天看了好长时间博客:    职业规划:    http://www.iteye.com/blogs/subjects/zhiyeguihua      android学习:    1.http://byandby.i</div> </li> <li><a href="/article/2230.htm" title="[JWFD开源工作流]尝试用原生代码引擎实现循环反馈拓扑分析" target="_blank">[JWFD开源工作流]尝试用原生代码引擎实现循环反馈拓扑分析</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a> <div>     我们已经不满足于仅仅跳跃一次,通过对引擎的升级,今天我测试了一下循环反馈模式,大概跑了200圈,引擎报一个溢出错误      在一个流程图的结束节点中嵌入一段方程,每次引擎运行到这个节点的时候,通过实时编译器GM模块,计算这个方程,计算结果与预设值进行比较,符合条件则跳跃到开始节点,继续新一轮拓扑分析,直到遇到</div> </li> <li><a href="/article/2357.htm" title="JS常用的事件及方法" target="_blank">JS常用的事件及方法</a> <span class="text-muted">cwqcwqmax9</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>事件 描述 onactivate 当对象设置为活动元素时触发。 onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发。 onbeforeactivate 对象要被设置为当前元素前立即触发。 onbeforecut 当选中区从文档中删除之前在源对象触发。 onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即</div> </li> <li><a href="/article/2484.htm" title="正则表达式验证日期格式" target="_blank">正则表达式验证日期格式</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/IT%E5%85%B6%E5%AE%83/1.htm">IT其它</a><a class="tag" taget="_blank" href="/search/java%E5%85%B6%E5%AE%83/1.htm">java其它</a> <div> 正则表达式验证日期格式 function isDate(d){ var v = d.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/i); if(!v) { this.focus(); return false; } } <input value="2000-8-8" onblu</div> </li> <li><a href="/article/2611.htm" title="Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证" target="_blank">Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>public array rules () {return} array 要调用 validate() 时应用的有效性规则。 返回属性的有效性规则。声明验证规则,应重写此方法。 每个规则是数组具有以下结构:array('attribute list', 'validator name', 'on'=>'scenario name', ...validation </div> </li> <li><a href="/article/2738.htm" title="UITextAttributeTextColor = deprecated in iOS 7.0" target="_blank">UITextAttributeTextColor = deprecated in iOS 7.0</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>In this lesson we used the key "UITextAttributeTextColor" to change the color of the UINavigationBar appearance to white. This prompts a warning "first deprecated in iOS 7.0." Ins</div> </li> <li><a href="/article/2865.htm" title="判断一个数是质数的几种方法" target="_blank">判断一个数是质数的几种方法</a> <span class="text-muted">EmmaZhao</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>质数也叫素数,是只能被1和它本身整除的正整数,最小的质数是2,目前发现的最大的质数是p=2^57885161-1【注1】。 判断一个数是质数的最简单的方法如下: def isPrime1(n): for i in range(2, n): if n % i == 0: return False return True 但是在上面的方法中有一些冗余的计算,所以</div> </li> <li><a href="/article/2992.htm" title="SpringSecurity工作原理小解读" target="_blank">SpringSecurity工作原理小解读</a> <span class="text-muted">坏我一锅粥</span> <a class="tag" taget="_blank" href="/search/SpringSecurity/1.htm">SpringSecurity</a> <div>   SecurityContextPersistenceFilter   ConcurrentSessionFilter   WebAsyncManagerIntegrationFilter   HeaderWriterFilter   CsrfFilter   LogoutFilter   Use</div> </li> <li><a href="/article/3119.htm" title="JS实现自适应宽度的Tag切换" target="_blank">JS实现自适应宽度的Tag切换</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>效果体验:http://hovertree.com/texiao/js/3.htm   该效果使用纯JavaScript代码,实现TAB页切换效果,TAB标签根据内容自适应宽度,点击TAB标签切换内容页。 HTML文件代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"</div> </li> <li><a href="/article/3246.htm" title="Hbase Rest API : 数据查询" target="_blank">Hbase Rest API : 数据查询</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a> <div>hbase(hadoop)是用java编写的,有些语言(例如python)能够对它提供良好的支持,但也有很多语言使用起来并不是那么方便,比如c#只能通过thrift访问。Rest就能很好的解决这个问题。Hbase的org.apache.hadoop.hbase.rest包提供了rest接口,它内嵌了jetty作为servlet容器。   启动命令:./bin/hbase rest s</div> </li> <li><a href="/article/3373.htm" title="JQuery实现鼠标拖动元素移动位置(源码+注释)" target="_blank">JQuery实现鼠标拖动元素移动位置(源码+注释)</a> <span class="text-muted">明子健</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E6%8B%96%E5%8A%A8/1.htm">拖动</a><a class="tag" taget="_blank" href="/search/%E9%BC%A0%E6%A0%87/1.htm">鼠标</a> <div>欢迎讨论指正!   print.html代码: <!DOCTYPE html> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <title>发票打印</title> &l</div> </li> <li><a href="/article/3500.htm" title="Postgresql 连表更新字段语法 update" target="_blank">Postgresql 连表更新字段语法 update</a> <span class="text-muted">qifeifei</span> <a class="tag" taget="_blank" href="/search/PostgreSQL/1.htm">PostgreSQL</a> <div>下面这段sql本来目的是想更新条件下的数据,可是这段sql却更新了整个表的数据。sql如下: UPDATE tops_visa.visa_order SET op_audit_abort_pass_date = now() FROM tops_visa.visa_order as t1 INNER JOIN tops_visa.visa_visitor as t2 ON t1. </div> </li> <li><a href="/article/3627.htm" title="将redis,memcache结合使用的方案?" target="_blank">将redis,memcache结合使用的方案?</a> <span class="text-muted">tcrct</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a> <div>公司架构上使用了阿里云的服务,由于阿里的kvstore收费相当高,打算自建,自建后就需要自己维护,所以就有了一个想法,针对kvstore(redis)及ocs(memcache)的特点,想自己开发一个cache层,将需要用到list,set,map等redis方法的继续使用redis来完成,将整条记录放在memcache下,即findbyid,save等时就memcache,其它就对应使用redi</div> </li> <li><a href="/article/3754.htm" title="开发中遇到的诡异的bug" target="_blank">开发中遇到的诡异的bug</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/bug/1.htm">bug</a> <div>今天我们服务器组遇到个问题: 我们的服务是从Kafka里面取出数据,然后把offset存储到ssdb中,每个topic和partition都对应ssdb中不同的key,服务启动之后,每次kafka数据更新我们这边收到消息,然后存储之后就发现ssdb的值偶尔是-2,这就奇怪了,最开始我们是在代码中打印存储的日志,发现没什么问题,后来去查看ssdb的日志,才发现里面每次set的时候都会对同一个key</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>