在这里插入代码片
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 时要添加判断为空的判断