ios-代码规范以及关键字的区别及用法
目录
一.规范之谈
二.关键字的使用
一.规范之谈
何为规范,为什么要有规范之说法。
中国有句老话:没有规矩不成方圆。完美的诠释了这一点,好的规范习惯,明理人一看便懂,而杂乱无章的行为或者习惯,只会给人不好的感觉,让人觉得看着都不舒服,反之,则一看清晰满目。
其次项目中的url以及通知、枚举也是清晰明了
我会将所有的通知名称、常量以及枚举都统一放到一个叫XXConst的类中,而项目所有的Url都放到一个叫XXConstUrl的类中。
注意:其中的XX可以以公司名称简写开头 也可以以项目名称开头。
为什么这样做?这么做有什么好处?
1.统一写在一起,好比这个头文件写一下,那个头文件写一下好点,这样让人看着简洁、舒服。
2.所有的Url放到一起的根源在于曾经吃过一次亏,由于后台人员的不断更换,前人挖坑后人埋坑。命名的不规范,有些是中文首拼,有些是英文,有些驼峰,有些不是驼峰。由于种种的杂乱无章,导致url方式大改,这下就坑了自己了。得每个类去改,多费事费时间。故全部将项目中的url写在一起有便于管理。
二.关键字的使用
static
static可分为3种类型:
- 静态全部变量
使用全局变量的作用域限于当前文件内部,只能内部文件才能访问该全部变量,外部访问不了
static NSString *const cellID = @"cellID";
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellID];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
cell.textLabel.text = [NSString stringWithFormat:@"test %zd",indexPath.row];
return cell;
}
@end
- 静态成员变量(C++里面有这个概念,OC没有这说法)
- 静态局部变量:定义在函数体内的,在函数外是不可见的,修饰局部变量保证永远只初始化一遍,在程序的运行中永远一份内存。
例如:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellID = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
cell.textLabel.text = [NSString stringWithFormat:@"test %zd",indexPath.row];
return cell;
}
- 示例小demo
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
int i= 0 ;
i ++ ;
NSLog(@"---------%zd",i);
}
假设不用status修饰的话,永远只会打印1,因为每次点击都会重新赤化一个全新的变量使得i = 0;自加之后就会打印结果为1.但是如果使用status修饰局部变量i的话,就会让局部变量永远只初始化一次,一份内存。故每点击一次都会i自加1。
图片.png
const
至于这个使用可以直接查看袁峥大佬写的【如何正确使用const,static,extern】
extern
我相信许多小伙伴除了这个extern没用过之外,其他的都用过了,这个也许有些小伙伴还没有听过,也许也有听过的,但是从没有使用过,在这里讲一下这个用途,正好项目中用到了,在这里顺便提一下。
作用:是一个全局变量,先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
注意:extern和static不能同时修饰一个变量
需求:需要在购物车界面记录tabBarItem.badgeValue的角标数量。然后常用清单和首页都需要用到刚刚记录的数量进行计算购物车角标数量总和再次进行角标计算。
图片.png问题疑惑解析:
为啥不直接在首页或者常用清单获取
self.tabBarController.childViewControllers[2].tabBarItem.badgeValue.integerValue;的值呢?是因为这里有个bug,数量在100以下是发现不了问题的,但是如果是100以上,问题就暴露出来了,不管是100多少左右,每次在常用清单或者首页一减直接变成98了,故便轮到extern上场 的时刻到了。
案例代码:方法+调用+打印输出
/*-----------------JYConst.h----------------------------*/
//购物车数量
extern NSInteger shopCartTotal;
/*-----------------JYConst.m----------------------------*/
NSInteger shopCartTotal = 0;
直接上图:清晰一点
UIKIT_EXTERN
随便见UIKit的头文件查看,可以看到苹果很多地方都有UIKIT_EXTERN这样的字眼。那么他的作用是什么呢。
如果多个.m都需要用到
// ali 支付完成通知
NSString * const kAliPayCompleteNotification = @"kAliPayCompleteNotification";
首先你不能在每个.m文件中进行复制粘贴,因为行不通,在编译时,会报重复定义。故此时我们可以模仿苹果的写法.解决重复定义的问题
// ali 支付完成通知
UIKIT_EXTERN NSString * const kAliPayCompleteNotification;
图片.png
Reading
看着这点东西说多不多,说少不少,却断断续续得写了2个小时。
- 如果在阅读过程中遇到 error || new ideas,希望你能 issue 我,我会及时补充谢谢。