iOS开发技术

ios-代码规范以及关键字的区别及用法

2018-01-22  本文已影响55人  flowerflower

目录

一.规范之谈
二.关键字的使用

一.规范之谈

何为规范,为什么要有规范之说法。
中国有句老话:没有规矩不成方圆。完美的诠释了这一点,好的规范习惯,明理人一看便懂,而杂乱无章的行为或者习惯,只会给人不好的感觉,让人觉得看着都不舒服,反之,则一看清晰满目。

图片.png

其次项目中的url以及通知、枚举也是清晰明了

我会将所有的通知名称、常量以及枚举都统一放到一个叫XXConst的类中,而项目所有的Url都放到一个叫XXConstUrl的类中。
注意:其中的XX可以以公司名称简写开头 也可以以项目名称开头。

图片.png 图片.png

为什么这样做?这么做有什么好处?

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

例如:


- (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;
}
- (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;

直接上图:清晰一点

购物车.png 常用清单.png
UIKIT_EXTERN

随便见UIKit的头文件查看,可以看到苹果很多地方都有UIKIT_EXTERN这样的字眼。那么他的作用是什么呢。
如果多个.m都需要用到

// ali 支付完成通知
NSString  * const kAliPayCompleteNotification = @"kAliPayCompleteNotification";

首先你不能在每个.m文件中进行复制粘贴,因为行不通,在编译时,会报重复定义。故此时我们可以模仿苹果的写法.解决重复定义的问题

// ali 支付完成通知
UIKIT_EXTERN NSString  * const kAliPayCompleteNotification;
图片.png

Reading


看着这点东西说多不多,说少不少,却断断续续得写了2个小时。

上一篇下一篇

猜你喜欢

热点阅读