iOS Development Guidelines
  • Introduction
  • 规范
    • 0. 介绍
    • 1. 序言
    • 2. 代码命名规范
      • 2.1. 代码命名基础
      • 2.2. 方法(Method)命名
      • 2.3. 函数(Function)命名
      • 2.4. 属性(Property)与数据类型命名
      • 2.5. 其它命名规范
      • 2.6. 可接受缩略名
    • 3. 代码格式规范
      • 3.1. 代码注释格式
      • 3.2. 代码结构与排版
    • 4. 开发实践
      • 4.1. Objective-C保留字
    • 5. Xcode工程结构
    • 6. 版本控制
      • 6.1. Git基本配置
      • 6.2. Git分支模型
      • 6.3. SVN源代码管理规范
      • 6.4. SVN的标准目录结构
    • 7. 附录
      • 7.1. Xcode扩展插件
      • 7.2. 第三方开源库
    • 8. 参考
    • 9. iOS开发优化
  • Swift编码规范
  • Objective-C新特性
  • iOS生命周期
  • Apple 官方设计指南
    • iOS 人机交互指南
      • 概览 - 设计理念
      • 概览 - iOS 10 新功能
      • 概览 - 接口要素
      • 交互 - 3D Touch
      • 交互 - 辅助功能
      • 交互 - 音频
      • 交互 - 身份验证
      • 交互 - 数据输入
      • 交互 - 反馈
      • 交互 - 文件处理
      • 交互 - 初次启动体验
      • 交互 - 手势
      • 交互 - 加载
      • 交互 - 模态
      • 交互 - 导航
      • 交互 - 评分和评论
      • 交互 - 请求权限
      • 交互 - 设置
      • 交互 - 术语
      • 交互 - 撤销与重做
      • 系统功能 - 多任务
      • 系统功能 - 通知
      • 系统功能 - 打印
      • 系统功能 - 快速预览
      • 系统功能 - Siri
      • 系统功能 - TV 供应商
      • 可视化设计 - 动画
      • 可视化设计 - 品牌化
      • 可视化设计 - 颜色
      • 可视化设计 - 布局
      • 图像 - 应用图标
  • Apple 官方开发指南
    • App 发布指南
      • 待完善
    • Cocoa 代码指南
      • 代码命名基础
      • 方法命名
      • 函数命名
      • 属性和数据类型命名
      • 可接受的缩写词和首字母缩写词
      • 针对框架开发者的技术细节
    • 核心蓝牙编程指南
      • 待完善
  • iOS 杂谈
    • Auto Layout 是怎么进行自动布局的性能如何
    • App 启动速度的优化与监控
    • 多人的大项目,架构怎么设计更合理
    • 链接器:符号是怎么绑定到地址上的
    • App 如何通过注入动态库的方式实现极速编译调试
    • 静态分析工具的选择
    • Clang的App 提质
    • 无侵入的埋点方案如何实现
    • 包大小:如何从资源和代码层面实现全方位瘦身
    • iOS 崩溃千奇百怪如何全面监控
    • 如何利用 RunLoop 原理去监控卡顿
    • 临近 OOM,如何获取详细内存分配信息,分析内存问题
    • 日志监控:怎样获取 App 中的全量日志
    • 性能监控:衡量 App 质量的那把尺
    • 远超想象的多线程的那些坑
    • 怎么减少 App 电量消耗
    • 除了 Cocoa,iOS还可以用哪些 GUI 框架开发
    • 细说 iOS 响应式框架变迁,哪些思想可以为我所用
    • 如何构造酷炫的物理效果和过场动画效果
    • A/B 测试:验证决策效果的利器
    • 怎样构建底层的发布和订阅事件总线
    • 如何提高 JSON 解析的性能
    • 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪
    • 怎么应对各种富文本表现需求
    • 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发
    • 如何制定一套适合自己团队的 iOS 编码规范
    • iOS 系统内核 XNU:App 如何加载
    • iOS 黑魔法 Runtime Method Swizzling 背后的原理
    • libffi:动态调用和定义 C 函数
    • iOS 是怎么管理内存的
    • 如何编写 Clang 插件
    • 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情
    • React Native、Flutter 等,这些跨端方案怎么选
    • 原生布局转到前端布局,开发思路有哪些转变
    • iOS原生、大前端和Flutter分别是怎么渲染的
    • 剖析使 App 具有动态化和热更新能力的方案
  • Flutter
    • 0.Flutter学习笔记以及问题记录
    • 1.Dart基础快速入门
    • 2.什么是声明式UI
    • 3.Flutter入门基础知识
    • 4.项目结构、资源、依赖和本地化
    • 6.布局与列表
    • 7.状态管理
    • 8.路由与导航
    • 9.手势检测及触摸事件处理
    • 9.线程和异步UI
    • 10.主题和文字处理
    • 11.表单输入与富文本
    • 12.调用硬件、第三方服务以及平台交互、通知
    • 13.基于Http实现网络操作
    • 14.图片控件开发详解
    • 15.异步:Future与FutureBuilder实用技巧
    • 16.APP首页框架搭建-Scaffold与PageView
Powered by GitBook
On this page
  • 一般规则
  • 存取方法
  • 代理方法
  • 方法集合
  • 方法参数
  • 私有方法

Was this helpful?

  1. Apple 官方开发指南
  2. Cocoa 代码指南

方法命名

Previous代码命名基础Next函数命名

Last updated 5 years ago

Was this helpful?

方法或许是你编程接口中最常见的元素,因此在它们的命名方面应当特别小心。这部分讨论方法命名方面的内容:

一般规则

有一些在方法命名方面的一些一般指南你应当记住:

  • 方法名应该以小写字母打头,然后紧接着后面每一个单词的首字母大写。不要使用前缀。参见。对于以上指南,有两个特别的例外,你可能用一个很有名的大写缩写词为方法名打头(例如 TIFF或PDF),而且你可能会使用前缀来标记组以及私有方法(参见)。

  • 当一个方法表示一个对象执行的动作的话,请以一个动词打头:

- (void)invokeWithTarget:(id)target; - (void)selectTabViewItem:(NSTabViewItem *)tabViewItem

不要使用“do”或者“does”作为方法名的一部分,因为这些辅助的动词很少能够增强意思。同样,绝不要在动词前面使用副词或者形容词。

  • 如果一个方法返回给调用者一个属性的话,用这个属性命名方法。没有必要使用“get”。除非不是直接返回一个或多个返回值。

译者注:,一直以来不是很喜欢Objective-C的Get方法的命名不带get。感觉不够明了。但是这个大家都习以为常。上面也说了,如果方法不是直接返回的,可以使用get,比如通过回调才能获取的属性。

方法命名

评述

- (NSSize)cellSize;

正确。

- (NSSize)calcCellSize;

错误。

- (NSSize)getCellSize;

错误。

  • 在所有参数前面使用关键词。

方法命名

评述

- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag;

正确。

- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;

错误。

  • 在参数之前描述这个参数。

方法命名

评述

- (id)viewWithTag:(NSInteger)aTag;

正确。

- (id)taggedView:(int)aTag;

错误。

  • 当你想要创建一个比继承的方法更加明确的方法的时候,请在方法结束之后,添加一些关键词。

方法命名

评述

- (id)initWithFrame:(CGRect)frameRect;

NSView, UIView.

- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide;

NSMatrix, NSView的子类

  • 不要在描述属性的关键词上使用“and”。

方法命名

评述

- (int)runModalForDirectory:(NSString )path file:(NSString ) name types:(NSArray *)fileTypes;

正确。

- (int)runModalForDirectory:(NSString )path andFile:(NSString )name andTypes:(NSArray *)fileTypes;

错误。

尽管在这个例子中,采用“and”看起来还可以,但是当你创建越来越多关键词方法的时候,会出问题。

  • 如果一个方法描述了两个单独的动作,可以使用“and”来连接他们。

方法命名

评述

- (BOOL)openFile:(NSString )fullPath withApplication:(NSString )appName andDeactivate:(BOOL)flag;

NSWorkspace.

存取方法

存取方法是用来设置和返回一个对象的属性值。有推荐的格式,取决于这个属性表达方式:

  • 如果这个属性是名词的话,格式是这样的:

    - (type)noun;

    - (void)setNoun:(type)aNoun;

例如: - (NSString *)title; - (void)setTitle:(NSString *)aTitle;

  • 如果这个属性是形容词,格式是这样的:

    - (BOOL)isAdjective;

    - (void)setAdjective:(BOOL)flag;

例如:

- (BOOL)isEditable; - (void)setEditable:(BOOL)flag;

  • 如果这个属性是一个动词,格式是这样的:

    - (BOOL)verbObject;

    - (void)setVerbObject:(BOOL)flag;

例如:

- (BOOL)showsAlpha; - (void)setShowsAlpha:(BOOL)flag;

动词应当使用简单的现在时。

  • 不要通过分词形式将动词转换成形容词:

方法命名

评述

- (void)setAcceptsGlyphInfo:(BOOL)flag;

正确。

- (BOOL)acceptsGlyphInfo;

正确。

- (void)setGlyphInfoAccepted:(BOOL)flag;

错误。

- (BOOL)glyphInfoAccepted;

错误。

  • 你可能会使用情态动词来阐述意思,但是不用使用“do” 或“does”。

方法命名

评述

- (void)setCanHide:(BOOL)flag;

正确。

- (BOOL)canHide;

正确。

- (void)setShouldCloseDocument:(BOOL)flag;

正确。

- (BOOL)shouldCloseDocument;

正确。

- (void)setDoesAcceptGlyphInfo:(BOOL)flag;

错误。

- (BOOL)doesAcceptGlyphInfo;

错误。

  • 仅当方法间接返回对象和值的时候,使用“get”命名。而且仅当对个条目需要返回的时候。

方法命名

评述

- (void)getLineDash:(float )pattern count:(int )count phase:(float *)phase;

NSBezierPath.

在以上这些方法中,方法的实现应当考虑针对这些输入输出参数可接受NULL值,来指明调用者不必对一个或者多个返回值感兴趣。

代理方法

代理方法是指在某一事件发生的时候,一个对象调用它的代理(如果实现了这个代理)。它们有独特的格式,同样适用于对象数据源的方法调用。

  • 方法打头请标明是哪个类的对象发送信息的:

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

类名省略前缀,并且第一个字母小写。

  • 一个冒号后附带类名(参数是代理对象的实例),除非这个方法只有一个参数,发送者。

- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;

  • 有一个例外就是,方法作为通知被发送的结果来调用。这种情况下,这个单独的参数就是通知对象。

- (void)windowDidChangeScreen:(NSNotification *)notification;

  • 在方法名上使用“did” 或 “will”用来通知代理,有事情已经发生或者即将发生。

- (void)browserDidScroll:(NSBrowser *)sender; - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;

  • 尽管你可以在方法名上使用“did” 或“will”,在方法被调用的时候,请求代理为另外一个对象做些事情,还是推荐“should”。

- (BOOL)windowShouldClose:(id)sender;

方法集合

对于那些管理对象集合的对象(每一个被称为集合的元素),约定为以下方法格式:

- (void)addElement:(elementType)anObj; - (void)removeElement:(elementType)anObj; - (NSArray *)elements;

例如:

- (void)addLayoutManager:(NSLayoutManager *)obj; - (void)removeLayoutManager:(NSLayoutManager *)obj; - (NSArray *)layoutManagers;

以下是对这个指南的限制和改进:

  • 如果这个集合的确是无序的,返回一个NSSet对象,而不是一个NSArray对象。

  • 如果向一个集合中指定位置插入一个元素非常重要,采用以下形式的方法:

- (void)insertLayoutManager:(NSLayoutManager *)obj atIndex:(int)index; - (void)removeLayoutManagerAtIndex:(int)index;

对于集合方法来说,这里有两个实现的细节需要注意:

  • 这些方法都显示的持有插入的对象,所以代码中添加或插入它们的时候,必须retain,移除它们的时候,必须release。

  • 如果插入的对象需要有一个反向指针指向主对象,你可以使用(通常情况下)一个 set方法设置方向指针,但是不要retain。至于insertLayoutManager:atIndex:方法, NSLayoutManager类已经在这些方法中处理了:

- (void)setTextStorage:(NSTextStorage *)textStorage; - (NSTextStorage *)textStorage;

你一般不会直接去调用setTextStorage:方法,但是可能需要重写它。对于上面关于集合方法约定的另外一个例子来自NSWindow类:

- (void)addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place; - (void)removeChildWindow:(NSWindow *)childWin; - (NSArray *)childWindows;

- (NSWindow *)parentWindow; - (void)setParentWindow:(NSWindow *)window;

方法参数

这里有一些设计方法参数命名的一般规则:

  • 和方法一样,参数要以一个小写字母打头,并且后续每一个单词的首字母要大写(例如: removeObject:(id)anObject)。

  • 不要在参数名中使用“pointer” 或“ptr”。使用参数类型,而不是声明它是不是一个指针。

  • 避免1-2个字母的参数名字。

  • 避免缩写。

一般来说(在Cocoa中),以下关键词和参数会同时使用:

...action:(SEL)aSelector ...alignment:(int)mode ...atIndex:(int)index ...content:(NSRect)aRect ...doubleValue:(double)aDouble ...floatValue:(float)aFloat ...font:(NSFont *)fontObj ...frame:(NSRect)frameRect ...intValue:(int)anInt ...length:(int)numBytes ...point:(NSPoint)aPoint ...stringValue:(NSString *)aString ...tag:(int)anInt ...target:(id)anObject ...title:(NSString *)aString

私有方法

大多数情况下,私有方法的命名遵循公共方法命名的一些规则。然而,一个常见的约定就是给私有方法一个前缀,以便它很容易与公共方法进行区分。如果你不遵循这个约定,私有方法的命名会导致奇怪的问题。当你设计一个Cocoa框架类的子类的时候,你可能会无意识的使用了一个与框架内部私有方法名一样的名字。

大多数Cocoa框架中的私有方法有一个下划线前缀(例如:_fooData ),用来标记它是私有方法。基于这个事实,有以下两个建议:

  • 不要在你的私有方法前使用下划线字符做为前缀。Apple保留这个约定。

  • 如果你要完全确保你的一个很大的Cocoa框架类(例如NSView 或 UIView)的子类中的私有方法的命名与父类中的私有方法的命名不同,你可以在你的私有方法前面加上一个你自己的前缀。这个前缀尽可能的唯一,或许基于你的公司或者项目,诸如“XX_”格式。所以,若你的项目叫做Byte Flogger,那么这个方法名可以是BF_addObject: 。

尽管给私有方法加上前缀的命名方式看起来像是与先前的提出的方法以类为区分的命名空间存在矛盾之处,但是这里的意图在于:防止无意识的重写了父类的私有方法。

排版约定
私有方法
ifeegoo