iOS学习笔记二——OC代码规范(上)

2023-11-03

一、规范格式

1.1 规范的head file格式

@interface的body内的结构为:

properties;

class methods;

initializers;

instance methods.

#import <Foundation/Foundation.h>

@class Bar;

/**
 * A sample class demonstrating good Objective-C style. All interfaces,
 * categories, and protocols (read: all non-trivial top-level declarations
 * in a header) MUST be commented. Comments must also be adjacent to the
 * object they're documenting.
 */
@interface Foo : NSObject

/** The retained Bar. */
@property(nonatomic) Bar *bar;

/** The current drawing attributes. */
@property(nonatomic, copy) NSDictionary<NSString *, NSNumber *> *attributes;

/**
 * Convenience creation method.
 * See -initWithBar: for details about @c bar.
 *
 * @param bar The string for fooing.
 * @return An instance of Foo.
 */
+ (instancetype)fooWithBar:(Bar *)bar;

/**
 * Initializes and returns a Foo object using the provided Bar instance.
 *
 * @param bar A string that represents a thing that does a thing.
 */
- (instancetype)initWithBar:(Bar *)bar NS_DESIGNATED_INITIALIZER;

/**
 * Does some work with @c blah.
 *
 * @param blah
 * @return YES if the work was completed; NO otherwise.
 */
- (BOOL)doWorkWithBlah:(NSString *)blah;

@end

1.2 规范的source file格式

#import "Shared/Util/Foo.h"

@implementation Foo {
  /** The string used for displaying "hi". */
  NSString *_string;
}

+ (instancetype)fooWithBar:(Bar *)bar {
  return [[self alloc] initWithBar:bar];
}

- (instancetype)init {
  // Classes with a custom designated initializer should always override
  // the superclass's designated initializer.
  return [self initWithBar:nil];
}

- (instancetype)initWithBar:(Bar *)bar {
  self = [super init];
  if (self) {
    _bar = [bar copy];
    _string = [[NSString alloc] initWithFormat:@"hi %d", 3];
    _attributes = @{
      @"color" : [UIColor blueColor],
      @"hidden" : @NO
    };
  }
  return self;
}

- (BOOL)doWorkWithBlah:(NSString *)blah {
  // Work should be done here.
  return NO;
}

@end

二、命名要求

2.1 功能明确

例如:insertObject,removeObjectAtIndex,setBackgroundColor,完整地体现事件过程,避免出现命名模糊的现象;

不规范命名:insert,setBkgdColor;

2.2 保持一致性

若有一个方法或属性出现在不同的类中,那么它们使用相同的标识符是有必要的,这种做法能体现出它们之间的关联,也有利于多态(polymorphism)的实现;

例如:

-(NSInteger)tag;
-(void)setStringValue:(NSString*);

2.3 使用前缀

来自同一个package或framework,使用同一个前缀,由于2个字符的前缀被apple保留,一般使用最少三个字符的前缀;

由于OC没有namespace,因此采用在类名和方法名前加上前缀的方法,能有效避免命名冲突;

例如:
NS:Foundation;
NS:Application Kit;
AB:Address Book;

2.4 排版惯例

将多个单词的首字母大写,其余字母小写,然后放在一起,这种方式被称为驼峰式;

小驼峰式:对于方法名和变量名,首字母小写,其余规则不变,例如:fileExistAtPath;

大驼峰式:对于类名,除前缀外,首字母大写,其余规则不变,例如:NSRunAlertPanel;

2.5 Class和Protocal

Class要求名词性命名,例如NSScanner,UIApplication;

为了和Class做区分,Protocal通常以X-ing的形式命名,例如NSLocking;

2.6 文件名后缀

Extension type
.h C/C++/Objective-C 头文件
.m Objective-C 源代码文件
.mm C/C++/Objective-C 源代码文件,可以使用C++特性
.cc C++源代码文件
.c C源代码文件

三、命名规则

3.1 方法和成员命名

返回值为object,使用与该object类型相关的名词作为前缀,例如:

GOOD:-(Sandwich *)sandwich;

AVOID:-(Sandwich *)makeSandwich);

返回值为BOOL类型,方法命名要求把is作为前缀,例如:

-(BOOL)isGlorious;

约定:成员的getter方法名为它本身,而不需要额外的get作为前缀,例如:

GOOD:-(id)delegate;

AVOID:-(id)getDelegate;

尽量避免直接使用成员变量,而是使用getter方法:

GOOD:NSEnumerator *enumerator = [frogs reverseObjectEnumerator];

AVOID:NSEnumerator *enumerator = frogs.reverseObjectEnumerator;

3.2 global变量

对于声明在方法和类之外的global变量,使用g作为前缀标识,并尽量少地使用;

Example: gGlobalCounter;

3.3 枚举型变量

声明的每个枚举成员都应该具有相同的前缀:与枚举标识符相同,即使不使用namespace,这种做法也可以有效避免冲突;

typedef NS_ENUM(NSInteger, DisplayTinge) {
  DisplayTingeGreen = 1,
  DisplayTingeBlue = 2,
};

3.4 局部变量

// GOOD:

CLLocation *location = [self lastKnownLocation];
for (int meters = 1; meters < 10; meters++) {
  reportFrogsWithinRadius(location, meters);
}

// AVOID:

int meters;                                         // AVOID.
for (meters = 1; meters < 10; meters++) {
  CLLocation *location = [self lastKnownLocation];  // AVOID.
  reportFrogsWithinRadius(location, meters);
}

在ARC下,强指针和弱指针都自动声明为nil,然而,大多数的指针不具有ARC的特性,不会被初始化,因此最好在声明时就进行初始化操作,而不是先声明,再初始化;

3.5 整型无符号数

为了防止数学运算中出现细微的误差,在计算前需要把无符号整型数进行转化,把它们变为signed integer来使用;

// GOOD:
NSUInteger numberOfObjects = array.count;
for (NSInteger counter = numberOfObjects - 1; counter > 0; --counter)

// AVOID:
for (NSUInteger counter = numberOfObjects - 1; counter > 0; --counter)  // AVOID.

3.6 不同位数下的变量类型

long, NSInteger, NSUInteger, 和CGFloat在32位和64位系统下的size不同,在赋值时需要考虑位数的影响;

// GOOD:

int32_t scalar1 = proto.intValue;

int64_t scalar2 = proto.longValue;

NSUInteger numberOfObjects = array.count;

CGFloat offset = view.bounds.origin.x; 

四、总结

资料地址:

https://github.com/google/styleguide/blob/gh-pages/objcguide.md;

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS学习笔记二——OC代码规范(上) 的相关文章

  • 如何使用USB接口对C51单片机下载固件

    使用USB转UART芯片对单片机下载固件时会遇到的问题 C51系列单片机在下载固件的时候需要断电重启 在使用RS232接口的时候不会遇到什么困难 因为RS232不需要进行识别 但是现在使用USB转UART的芯片时会遇到问题 因为USB设备在
  • CIFAR-10训练模型(ResNet18)

    1 搭建环境 环境在实验进行时已经搭建完毕 具体步骤就不过多赘述 参考 https blog csdn net weixin 39574469 article details 117454061 接下来只需导入所需的包即可 import n
  • python中列表数据汇总和平均值_如何从记录列表中计算平均值

    所以我正在做一个作业 当从一个数据列表中计算一个平均值 数据是从一个外部的 txt文件中读取的 时 我似乎遇到了麻烦 具体来说 我要做的是从下面的数据列表中读取数据记录 在1 2 2014 Frankton 42305 67 23 12 4
  • 高德地图API INVALID_USER_SCODE问题以及keystore问题

    转载地址 http m blog csdn net article details id 50448014 请尊重原创 今天这篇文章会给大家介绍三个问题 1 接入API时出现invalid user scode问题 首先进行第一个大问题 接
  • python连接数据库设置编码_python连接mysql数据库——编码问题

    编码问题 1 连接数据库语句 在利用pycharm连接本地的mysql数据库时 要考虑到的是将数据库语句填写完整 困扰了一下午的问题就是连接语句并没有加入编码设置 db pymysql connect host localhost user
  • 如何利用计算机打印较大的字,如何在一张A4纸上打印一个超大字?

    是不是很想打印超大字 要是硬件上去了 就什么话也不用说了 可惜的是 手中只有一个A4的打印机 怎么办 还是有办法的 用Microsoft Office 2003就可以 我由于学校工作的原因 打印机只能打A4的纸 有时又想打超大字 不得不用现
  • TensorFlow零基础入门,实现手写数字识别

    TensorFlow 是一个用于人工智能的开源神器 主要为深度学习算法提供了很多函数 以及独特的运算支持 废话不多说直接上干货 我的环境 python3 7 tensorflow 1 13 2 numpy 1 20 2 1 入门示例 imp
  • 算法分享三个方面学习方法(做题经验,代码编写经验,比赛经验)

    目录 0 前言 遇到OI不要慌 只要道路对了 就不怕遥远 1 做题经验谈 1 1 做题的目的 1 2 我对于算法比赛的题目的看法 1 2 1 类似题 1 2 2 套模型 1 3 在训练过程中如何做题 1 4 一些建议 提高算法能力 1 5
  • AJAX分页以及IFRAME载入

    AJAX获取数据并分页显示 ul class movList ul div div
  • leetcode-03. 数组中重复的数字刷题笔记(c++)

    写在前面 难度 简单 unordered map 或 sort排序 大数组方法异常溢出 数据量 小数据量 数组元素作为下标 大数据量 无需map映射 耗费空间 sort排序 前后元素是否等值 题目详情 找出数组中重复的数字 在一个长度为 n
  • 一条慢SQL引发的改造

    前言 闲鱼服务端在做数据库查询时 对每一条SQL都需要仔细优化 尽可能使延时更低 带给用户更好的体验 但是在生产中偶尔会有一些情况怎么优化都无法满足业务场景 本文通过对一条慢SQL的真实改造 介绍解决复杂查询的一种思路 以及如何使得一条平均
  • Seata 处理分布式事务

    文章目录 1 Seata 简介2 2 Seata的安装 2 1 修改配置文件 2 2 在nacos上创建配置文件 seataServer yaml 2 3 安装路径seata seata server 1 6 0 seata script
  • C# —— 面向对象编程练习

    C 面向对象编程练习 基础题 代码如下 class Program static void Main string args rectangle r new rectangle Console WriteLine 调用不含参构造函数初始化后
  • [ElasticSearch]painless脚本获取字段方式及性能比较

    一 3种常见方式 doc fieldname 常用于在搜索或排序等无状态操作时进行使用 params source fieldname 也是常用在搜索或排序中 但更多用在获取额外字段时灵活操作时使用 如不获取某个字段直接使用params s
  • 基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 2 算法运行软件版本 matlab2022a 3 部分核心程序 Rr Cc size Image1 获取
  • 适配器模式(Adapter)

    适配器是一种结构型设计模式 它能使接口不兼容的对象能够相互合作 又称封装器模式 Wrapper 适配器模式通过封装对象将复杂的转换过程隐藏于幕后 被封装的对象甚至察觉不到适配器的存在 例如 你可以使用一个将所有数据转换为英制单位 如英尺和英
  • C#中的解构

    解构是将一个对象分割成若干部分并将其存储到新的变量中 在 C 中 解构可以方便地一次性将一个对象的多个成员的值存储到多个变量中 1解构元组 元组为方法返回多个值提供了便捷 无需创建额外的类型来承载返回的值 例如 下面这个方法使用元组返回两个
  • 创建进程函数fork的使用(Linux系统编程)

    使用fork函数创建一个进程 pid t fork void fork函数调用成功 返回两次 返回值为0 代表当前进程是子进程 返回值为非负数 代表当前进程为父进程 如果调用失败则返回 1 代码 include

随机推荐

  • 肝进ICU,万字真言点化八大排序——我奶奶都看得懂的算法详解

    目录 传统艺能 排序应用 插入排序 冒泡排序 希尔排序 预排序 堆排序 选择排序 快速排序 hoare 法 挖坑法 前后指针法 取中优化 小区间优化 非递归快排 归并排序 非递归归并 各类算法复杂度比较 传统艺能 小编是双非本科大一菜鸟不赘
  • linux内核——list_for_each_entry

    在Linux内核源码中 经常要对链表进行操作 其中一个很重要的宏是list for each entry 意思大体如下 假设只有两个结点 则第一个member代表head list for each entry的作用就是循环遍历每一个pos
  • linux 文件的压缩、打包与备份

    1 gzip 可以说是应用最广的压缩命令了 可以解开 compress zip gzip 等软件所压缩的文件 gzip所创建的压缩文件为 gz 的文件名 gzip 和 bzip2 用法几乎相同 2 最常见的打包命令tar c 建立压缩档案
  • 步道乐跑怎么刷次数_团团提醒您,您的步道乐跑次数不足,请及时充值哦

    你干嘛去 跑步去啊 等等我 我们一起 不知道那大明湖畔的步道乐跑大家还记得吗 步道乐跑被许多人戏称为 立志于摧残锻炼大学生的App 在学期刚开始的时候 大家也是立过flag 想要自律 每天两公里 争取早日跑完乐跑 相信你们在前几天是这样的
  • SpringBoot连接mysql密码正确但SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES)

    SpringBoot mysql连接问题简介 在application yml文件中设置datasource配置如下 此时不加双引号 执行数据库连接 会出现异常java sql SQLException Access denied for
  • 产品经理不懂技术的后果很严重

    目前产品研发的流程中分工越来越细 很多公司都将产品和研发进行了分离 产品负责需求的分析和产品的设计 很多产品并不懂技术 而且由于这种分离很多时候都是用跨部门来设定的 因此产品和技术的沟通很难 这就导致了以下普遍存在的问题 1 系统的扩展性非
  • MySQL用户权限及管理

    一 mysql创建用户 1 创建用户 mysql gt create user test identified by 123456 创建了用户 但是没有任何权限 Query OK 0 rows affected 0 00 sec mysql
  • JAVA线程同步

    线程同步 线程同步 即当有一个线程在对内存进行操作时 其他线程都不可以对这个内存地址进行操作 直到该线程完成操作 其他线程才能对该内存地址进行操作 而其他线程又处于等待状态 实现线程同步的方法有很多 为什么要创建多线程 在一般情况下 创建一
  • Python3实现一个简单的接口服务实现跨域请求

    使用Python实现一个简单的接口服务 可以通过get post方法请求该接口 拿到响应数据 创建一个api server py文件 添加代码如下 import json from flask import request Flask im
  • python+selenium+unittest+HTMLTestRunner读取csv文件参数化登陆测试

    之前尝试了Python selenium unittest HTMLTestRunner 传送门 写了登陆脚本 然后又看了参数化及循环 于是决定写个参数化的登陆脚本 当然遇到问题是在所难免的 几经周折 最后还是完成了参数化脚本 所以写下本帖
  • 求最大公约数的三种算法(java实现)

    目录 一 连续整数检测算法 二 欧几里得算法 三 分解质因数 一 连续整数检测算法 1 t min m n 2 m 除以t 如果余数为0 则执行步骤3 否则 执行第4 步 3 n 除以t 如果余数为0 返回t 的值作为结果 否则 执行第4
  • 用递归算法遍历一个目录,打印所有文件的名字

    用递归算法遍历一个目录 打印所有文件的名字 import os def walk dirname for name in os listdir dirname 遍历形参文件中的名字 path os path join dirname nam
  • AIX命令集锦九(TCP/IP网络管理命令)

    9 1 主机名修改命令hostname uname n 显示主机名uname x uname a uname u 显示操作系统的详细信息 显示系统IDhostname 主机名 这样改的主机名只能保持到下次重起smit hostname 或c
  • pycharm: unused import statement错误解决方法

    在pycharm中导入numpy包等 有时候字体都呈现灰色 看提示为 unused import statement 如果出现上述问题 可以从以下几个方面进行尝试 1 Pycharm file 菜单下有Invalidate caches R
  • 数据仓库——分层原理

    目录 一 什么是数据仓库 二 数仓建模的意义 为什么要对数据仓库分层 三 ETL 四 技术架构 五 数仓分层架构 数仓逻辑分层 1 数据引入层 ODS Operational Data Store 又称数据基础层 1 1 数据主要来源 1
  • php mail 权限,PHP mail()函数漏洞总结 · MYZ’s Blog

    漏洞成因 email protected golunski曝光了多个使用PHP mail函数引发命令执行的漏洞 众多使用php内置mail函数的第三方邮件库 如phpmailer SwiftMailer 纷纷中招 这些漏洞的成因和之前曝光的
  • 区块链+保险,落地还有多远?

    以前的区块链还在和炒币紧紧相连 现在 区块链就已经在去币化的路上越走越远 如今 已迅速渗透到保险行业 从风控 运营 再保险等方面影响保险公司的效率和商业模式 随着区块链技术的日益发展 已有不少保险巨头和新兴创业公司开始使用区块链技术来防范保
  • 大数据相关技术学习

    https github com lishuai2016 ls bigdata learn
  • 硬十宝典学习笔记_各种地

    1 定义 GND 指的是电线接地端的简写 代表地线或0线 作为电路或系统基准的等电位点或平面 电路图上和电路板上的GND Ground 代表地线或0线 GND就是公共端的意思 也可以说是地 但这个地并不是真正意义上的地 是出于应用而假设的一
  • iOS学习笔记二——OC代码规范(上)

    文章目录 一 规范格式 1 1 规范的head file格式 1 2 规范的source file格式 二 命名要求 2 1 功能明确 2 2 保持一致性 2 3 使用前缀 2 4 排版惯例 2 5 Class和Protocal 2 6 文