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(@"右");
    }
    
}
原文地址:https://www.cnblogs.com/someonelikeyou/p/5195350.html