iOS 52个技巧学习心得笔记 第一章 熟悉OC
1 .简单了解OC
2 .在类的头文件中尽量少引入其他头文件
3 .多用字面量语法 少用与之等价的方法
4 .多用类型常量 少用 #define 预处理指令
5 .用枚举表示状态,选项,状态码
1 .简单了解OC (1) oc使用消息机结构 : 其运行时 使用的代码由运行环境决定 c++ java 使用函数调用:由编译器决定 (2)oc 的指针对象总是会被分配在内存”堆空间”heap,也就是说绝不会分配在栈中stack(指针实例分配在堆上 指针[名称]在栈上) (3)一个对象到底是被引用还是一个不同的实例???(或者说 是被引用 还是拷贝) 引用:说明这个对象或者叫一个变量也好 是和引用对象共用一个内存地址 拷贝:单独占用了一块内存 是和前一个对象是完全不同的对象 例如: NSString *somethingStr = @“somethingString”; NSString *anotherStr = somethingStr; 这里 some 和 another 是两个相同内容的对象 一个NSString实例,another 对some 的引用 但是共用一个内存空间
2 .在类的头文件中尽量少引入其他头文件 目的: 减少类的使用者引入的头文件的数量 ,防止 引入过多根本用不到的内容而导致编译的时间增加 还可以防止出现 两个类互相引用头文件导致 循环饮用的问题 有些头文件是有条件使用 不是必然被使用的情况 这可以将引用头文件的时机尽量延后,只有在的确有需要的时候才引入 达到上述目的 这叫”向前声明 forward declaring” 使用举例: @class 用时才声明的类名 @interface XXX:XXXX 每次在头文件引入其他头文件时,都需要问问自己这样做是否有必要,能否用向前声明的方式去代替. 如果因为要实现属性或者实例变量或者要遵从的协议而必须要引入头文件(该文件继承于超类 或者遵从于某个协议),这个时候要尽量使用类别的方式(也有叫分类的 class-continuation).这样做不仅减少编译时间,还能降低彼此的依赖程度 利于维护
3 . 多用字面量语法 少用与之等价的方法 好处: 缩减代码长度 代码整洁 可读性强. Fundation框架几个类 NSString NSNumber NSSArray NSDictionary(不可变的对象) 例如NSString 字面量语法 NSString *str = @“hellow world”; 其他的创建初始化方式就是 “allco init”方式了 NSNumber: NSNumber *intNumber = @1; NSNumber *floatNumber = @2.5f; NSNumber *doubleNumber = @3.14159; NSNumber *boolNumber = @YES; NSNumber *charNumber = @`a`; 字面量语法也适用于下述表达式 int x = 5; float y = 3.1; NSNumber *expressionNumber = @(x * y); 以字面量来表示数值 可以使 NSSNumber 对象变得整洁 因为声明中只包含数字 而没有多余的语法成分 NSArray: 创建 : NSArray *fruitArr = @[@“apple”,@“Pear”,@“Banana”]; 读取对应对象(“取下标操作”) NSString *fruitName = fruitArr[1]; //打印 出结果 是 Pear //注意数组元素不能为nil 会抛出异常 NSDictionary: 创建: NSDictionary *dic = @{@“key1”: “value1”,@“key2”: “value2”,@“key3”: “value3”,@“key4”: “value4”}; //同数组一样 也不可存在nil 空值 可变数组与字典 修改元素值 操作(取下标法) mutableArr[1] = @“Pitch”;//位置为1的元素 改为 Pitch mutableDic[@“key2”] = @“value5”;//键值为key2的value 改为 value5 局限 如果自定义了上述类 这些自定义的子类不能使用字面量语法
4 .多用类型常量 少用 #define 预处理指令 尽管直接用宏定义 很方便 ,的确 宏定义可以是一个常量 可以是一条语句 甚至可以是一个方法 但是缺点: 宏定义没有类型信息 可读性差 编译过程会把整个宏定义的那段”代码”插进去运行,那么有几处这个宏 就会创建几遍 效率低 总在头文件中声明预处理指令 久而久之会冲突 提倡方式: (1)如果是全局常量 (写在哪都行 但是要遵守命名规范 否则可读性差 修改也不方便)我们的工程文件中有一个专门存放常量的文件Constants.h/Constants.m 这样 需要通常的全局常量的时候 非常方便寻找 归类非常明显 举例: // // Constants.h // TableViewDemo // // Created by HF on 16/2/17. // Copyright © 2016年 HF-zhjh. All rights reserved. // #import <Foundation/Foundation.h> extern NSString *const CLICK_TROUBLE_ITEM; @interface Constants : NSObject @end // // Constants.m // TableViewDemo // // Created by HF on 16/2/17. // Copyright © 2016年 HF-zhjh. All rights reserved. // #import "Constants.h" NSString * const CLICK_TROUBLE_ITEM = @"CLICK_TROUBLE_ITEM"; @implementation Constants @end (2)固定的某个实现文件中使用常量 举例: 在.m文件中实施 static const NSInteger sumCount = 100; @implementation XXXXXX
5 .用枚举表示状态,选项,状态码 好处:枚举是开发中常用的常量命名方式,使用枚举 使代码更具统一性,可读性. “整型的另一个名字” 要点: //NS_ENUM,定义状态等普通枚举 //NS_OPTIONS,定义选项 例如位移枚举等 (具体问题具体分析) 一般枚举 (1)一般没有附加操作,枚举默认第一个参数 为 0 然后依次递增加1 (2)也可以自定义 枚举参数对应的整数值 位移枚举(按位与 2进制 最多8位 2的8次幂 那么范围在 (0 到 255 一共256种枚举)) 好处: 位运算可以确保枚举值组合的唯一性. typedef NS_OPTIONS(NSUInteger, ActionType) { ActionTypeNone = 0, ActionTypeUp = 1 << 0, // 1 2的0次幂 ActionTypeDown = 1 << 1, // 2 2的1次幂 ActionTypeRight = 1 << 2, // 4 2的2次幂 ActionTypeLeft = 1 << 3, // 8 2的3次幂 }; 使用场景: 把传递给某个方法的选项表示为枚举类型,多个选项又可以同时使用,那么最适合使用 位移枚举 在官方SDK,特别宠幸这种方法. 主要优势:还是可读性特别强 (当然 一般枚举也可以实现同样的功能) 使用举例: //双目运算符 | 按位或运算 & 按位与运算 ^按位异或 ActionType type = ActionTypeUp | ActionTypeLeft | ActionTypeRight | ActionTypeDown; // 15 这步是赋值举例子 [self action:type]; 2016-02-17 16:46:52.495 TableViewDemo[3465:606362] 上 2016-02-17 16:46:52.496 TableViewDemo[3465:606362] 下 2016-02-17 16:46:52.496 TableViewDemo[3465:606362] 左 2016-02-17 16:46:52.496 TableViewDemo[3465:606362] 右 ///// - (void)action:(ActionType)type { if (type == 0) { return; } if ((type & ActionTypeUp) == ActionTypeUp)//也可写作 if(type & ActionTypeUp) { NSLog(@"上"); } if ((type & ActionTypeDown) == ActionTypeDown) { NSLog(@"下"); } if ((type & ActionTypeLeft) == ActionTypeLeft) { NSLog(@"左"); } if ((type & ActionTypeRight) == ActionTypeRight) { NSLog(@"右"); } }
分类:
学习50个OC开发技巧笔记
posted on 2016-02-18 11:01 ACM_Someone like you 阅读(509) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)