Ios代码规范《二》

在这里插入代码片1.判断字符串是否相等
实例:

 NSString *stA = @"abc";
    NSString *strB = [[NSString alloc]initWithFormat:@"abc"];
    if (stA == strB) {
        NSLog(@"相等");
    }else{
        NSLog(@"不相等");
    }

输出不相等,判断语句是stA == strB,stA和strB分别代表不同的对象,虽然字符串的内容是相同的,但是指的对象不相同,而我们的本意是判断字符串是否相等

if ([stA isEqualToString:strB])   //判断的是字符串的内容

2.数据类型

  • 基本数据类型
    int float NSInteger
    !!! NSNumber 是对象类型,所以NSNumber比NSInteger 要复杂,当然功能也要强大很多
  • 对象类型

我们知道数据里面只能存放对象类型,所以当我们需要存放 int float NSInteger时需要把它转化为NSNumber

3.可变数据和不可变数据

前言:在ios 中有时候我们需要把对象存放在一个容器中,然后对容器统一处理,这时候就引入了数组和字典的概念

  • NSArray:是一个有序IDE数据,我们一但创建了一个不可变的数据,在整个app运行我们我们不可以在删除和添加任何一个对象
  • NSMutableArray:里面继承了NSArray所有的方法

NSArray 是静态数组,而NSMutableArray是动态数组,尽管NSArray能做到的NSMutableArray都可以做到,但是出于性能考虑NSArray的遍历性能要高于NSMutableArray。
总结:当我们需要对数组进行增删改查时,用NSMutableArray,当我们对数组进行遍历和查询时用NSArray

!!!在可变数组当我们遍历的时候又要删除对象用

 [list enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
    }];

曾经遇到过问题,用别人写的控件他要传的是不可变数组,里面做了判断,里面的元素和上一次的元素是否一样,不一样的话,才设置当前选中的为第一页,而我传进的是可变的数组,并且我的数组是用懒加载创建的,所以当刷新视图的时候一直一样,出现bug,我应该mutableDict.copy 用它这样每次都会是新的数组,地址不一样

不可变数组变成可变数组mutableDict.copy 是深拷贝
copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝

切记改用不可变得数组时,不要用可变的数组。

  • 浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址
  • 深拷贝是真正的复制了一份,复制的对象指向了新的地址

4.懒加载


//重写getter方法
-(UILabel *)nameLable{
    //先判断是否存在
    if (!_nameLable) {
        _nameLable = [[UILabel alloc]initWithFrame:CGRectZero];
        [self.view addSubview:_nameLable];
        //!!切记在getter 方法中千万不可使用self.nameLable,
        //因为self.nameLable 本身就是调用getter 方法这样容易造成死循环
    }
    return _nameLable;
}
 - (void)viewDidLoad {
    [super viewDidLoad];
    [self.nameLable setText:@"代码规范"];
    //这里的self.nameLable 先调用getter方法,注意一定要使用.语法
  }
  • //!!切记在getter 方法中千万不可使用self.nameLable,
    //因为self.nameLable 本身就是调用getter 方法这样容易造成死循环

  • //这里的self.nameLable 先调用getter方法,注意一定要使用.语法

5.视图层级结构管理

View 是一个一个的叠加上去的,逻辑很清晰,然而移除View的逻辑比较复杂,在整个View的管理中,View有可能被移到最前面,也有可能被移到最后面,这个是一个动态的调整过程。,整个视图的管理上从本质上来说,有一下四中组合

  • addSubview:
  • removeFromSuperview
  • bringSubviewToFront:
  • sendSubviewToBack:

在开发过程中有时候需要从父视图中移除所有的子视图

[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

当我们需要移除指定的子视图

for (UIView *view in self.view.subviews) {
            if ([view isKindOfClass:[AmountView class]]) {
                [view removeFromSuperview];
            }
        }

6.代码可维护性

  • 工程命名:创建工程时,必须用英文或者拼音来命名,不能使用中文
  • 创建文件时,在文件历史记录的注释中加入文件的意义
  • 常量命名:在常量命名前面加K作为前缀
  • 类名与变量名:类名的首字母需要大写,变量首字母要小写
  • 与业务逻辑相关的if语句,务必加上注释
  • 资源文件最好不要直接拖拽到工程中,而是先创建文件夹,在导入资源文件。

7.面向对象的编程思想
(1)判断nil或者YES/NO最好采用以下方式判断

if(someObject){
}
if(!someObject){
}

不建议使用

if(someObject == YES){
}
if(someObject = nil){
}

(2)注意使用NSArray和NSMutableArray,遍历时使用NSArray
(3)定义属性变量时,如果内部使用的属性,那么就定义成私有属性(.m中声明)
(4)在.h中声明的属性变量建议通过self.使用,在.m声明的属性建议以下划线_打头
(5)在添加对象NSMutableArray 和NSMutableDictionary 时要添加判断为空的判断

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值