OC核心基础快速掌握之万丈高楼平地起

版权声明:最短的时间最核心的知识,有疑问,欢迎进行留言。 https://blog.csdn.net/lizhidefengzi/article/details/83795666

本博旨在最短的时间内的总结最核心的知识,如果有疑问,欢迎进行留言,我会在看到消息后第一时间内回复,如果有错误,欢迎指出,非常感谢。

核心思想

任何语言的学习都需要先掌握最基本的元素:
基本数据类型、集合类型程序结构类/属性/方法

一、基本数据类型

1. 数据元素

命名规则:由字母、数字、下划线、$符号组成 大小写敏感
定义变量时候不能使用关键字
在这里插入图片描述
基本数据类型(前面6行右边为输出方式):

int %d / %i
short %hd / %hi
long %ld / %li
unsigned int %u
float %f
char %c
double id(通用的指针类型) enum(声明枚举类型)
signed struct union (共用体联合) void(声明函数无返回值或者无参)

2.运算符

  • 加减乘除+ - * / %
  • += -=
  • 自增 a++ ++a
  • sizeof()
  • , (逗号运算符) 举例:int b=(1=5,a++,a*6) ,结果是36
  • 关系运算符(返回结果真为1,假为0) 且> < >= <= 优先级高于 == !=
  • 逻辑运算符: 与或非 && || ! (注意:&&前面为假,后面不会进行运算,||前面为真,后面不会进行运算)
  • 位运算符 << >>
  • 三目运算符 条件? 真语句执行:假语句执行

3.集合类型

NSArray 和 NSMutableArray
NSDictionary和NSMutableDictionary
集合类学习
数组的四种遍历方式

二、程序结构

1. 顺序结构

2. 分支结构

3. 循环结构

程序结构

三、类/属性/方法

类/属性/方法

四、常用的#define宏定义

1.定义常量
(1)定义导航栏的高度 竖屏时,导航栏高度为44,这时可以定义一个常量

#define kNavigationBarHeight 44

(2)屏幕的宽度

#define KSCREEN_WIDTH [UISCREEN mainScreen].bounds.size.width
#define KSCREEN_HEIGHT [UISCREEN mainScreen].bounds.size.height

2.内存的安全释放对象

#define SAFE_RELEASE(x) [x release];x=nil

注意尾句没有冒号,这句在dealloc时候调用,delloc时候将对象置为nil,这就释放了该对象的内存区域,防止内存泄漏
3.判断IOS系统版本
(1)当前系统版本号

扫描二维码关注公众号,回复: 5641672 查看本文章
#define kCurrentSystemVersion [[[UIDevice currentDevice] systemVersion] floatValue]
#define IOS_VERSION_9_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0)?(YES):(NO))

(2)当前的系统语言

#define kCurrentLanguage [[NSLocale preferredLanguages]objectAtIndex:0]

4.调试信息

#ifdef DEBUG  
# define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);  
#else  
# define DLog(...);  
#endif
  1. VA_ARGS
    是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
  2. FILE 宏在预编译时会替换成当前的源文件名 。
  3. __LINE__宏在预编译时会替换成当前的行号。
  4. FUNCTION__宏在预编译时会替换成当前的函数名称 有了以上这几个宏,特别是有了__VA_ARGS ,调试信息的输出就变得灵活多了。

5.判断是否是ARC

#if __has_feature(objc_arc)
//使用arc编码
#else
//使用手动内存管理
#endif

6.定义GCD的后台线程和主线程

//后台运行
#define BACK_GCD(block) dispatch_async(dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),block)
//主线程运行
#define MAIN_GCD(block) dispatch_async(dispatch_get_main_queue(),block)

五、面向对象特性

1.构造方法、自定义构造方法、id类型

1.1 id类型

(1)id是一种类型,万能指针,能够指向/操作任何的对象
typedef struce objc_object id;
注意点:在使用id定义的时候,一定要注意
id类型默认已经包含了*,所以不需要在加*。
局限性:调用一个不存在的方法,编译器会马上报错。
(2) instancetype类型

  1. instancetype会让编译器检查实例化对象的准确类型
  2. instancetype只能用于返回类型,不能当做参数使用
  3. 相比id类型,instancetype只能用在返回值类型,不能像id一样用在参数类型上
  4. instancetype比id多一个好处:编译器会检测instancetype的真实类型
1.2构造方法

(1)完整的创建一个对象:Person *p = [Person new];
new分别调用两个方法:alloc(分配空间),init(初始化空间)
(2)重写构造方法
三步:
1.初始化当前列的实例变量之前,初始化父类的
2.初始化当前类的实例变量
3.返回

举例说明

-(id)init{
    if (self = [super init]) {
        _age = 18;
        _weight = 50.0f;
    }
    return self
}
1.3自定义构造函数

规范:一定是对象方法- 开头
返回值一般是id类型
方法名一般以initWith开头

-(id)initWithName:(NSString *)name andAge:(int)age {
    //先做父类事情
    if(self = [super init]) {
        _name = name
        _age = age
    }
    return self
}

重写:指的是将父类的方法重写实现(子类不需要在声明,其实是内部默认已经声明)

2.函数与方法的区别

2.1方法

方法是Object-C独有的一种结构,只能在Object-C中声明和使用,C语言不能声明、定义和使用。

  1. 类方法以+号开头,对象方法以-号开头
  2. 在@interface 和 @end 之间声明,在@implention和 @end之间定义
  3. 类方法只能有由类来调用,对象方法只能由对象来调用
  4. 方法声明和实现中用到的数据类型必须使用()括住
2.2函数

函数即C语言中的函数

  1. 函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
  2. 函数调用不依赖对象
  3. 函数内部不能直接通过成员变量名访问某个对象的成员变量

猜你喜欢

转载自blog.csdn.net/lizhidefengzi/article/details/83795666
今日推荐