OC初级基础语法与内存管理MRC

      Objective-c初级复习     

•   C语言回顾

一.数据类型
名称 占位符 字节数
int 整数类型 %i/%d 4
float 单浮点数 %f/%.2f 4
double 双浮 %lf 8
char 英文字符 %c 1
unichar 中文字符 %C 2
char ch[10] 字符数组(字符串) %s

@encode(数据类型) – 得到指定数据类型的占位符
sizeof(数据类型) – 得到指定数据类型所占字节数

二.常量
语法:

define 常量名称 值(数值,字符串、代码)

注意:
1.常量名称使用全大写
2.不需要使用“;”结束

特点:
1.提高可读性
2.可修改性

三.定义宏
语法:#define 常量名 值(数值、表达式、代码块)

define HX_MAX 100

define Fx(a,b) a>b?a:b

define PT(s) printf(“result is %i”,s)

注意:
1).定义宏不需要使用“;”结束
2).常量名一般大写

四.枚举和结构体

1)枚举 enum
语法:
enum 名称{
Mon=0,
Tus,
Sum
};

typedef 已有数据类型 别名;
typedef enum 名称{
Mon=0,
Tus,
Sun
}WEEK;

使用:
WEEK wk = Sun;

2)结构体 struct
语法:
struct stu{
int no;
float score;
};

使用:
struct stu s;
s.no = 8;
s.score = 88.0;

注意:
1.一定需要使用”;”结束
2.枚举中的元素值默认从0开始

五.函数
1.语法:
返回值 方法名称(参数类型 参数名){
实现
}

返回值: void表示无返回值
方法名称: 方法名的首字母小写,方法名一定要有意义
2.math函数
1.sqrt(a) 求根、开方
2.pow(a,b) 求幂 (a的b次方)
3. abs(a),fabs(a),fabsf(a) 取绝对值

3.随机数
int num6 = arc4random()%101+100; //100-200
arc4random() 取随机数(oc中)

NSInteger 整型 %li
NSUInteger 无符号的整型(正整数)%lu
CGFloat 双精度浮点数 %lf

4.常量
NSInteger num7 = RAND_MAX; //最大随机数
NSInteger num8 = NSIntegerMin; //最小的整数
NSInteger num9 = NSIntegerMax; //最大的整数
M_PI 圆周率(3.14159…)

5.指针(ch4)
定义:存储指定对象在内存的首地址

组成:代码区和数据区

数据区:
常量区
全局、静态区
栈区
堆区

第二章 第一个OC程序
第三章 Xcode的使用
第四章 OC面向对象(语法)

面向对象的组成:类、方法、属性

类的组成:.h和.m文件

  1. .h头文件

import 导入头文件

作用:
1.声明成员变量
2.声明属性和方法

语法:
@interface 类名:NSObject{
声明成员变量
}

声明属性和方法
@end

方法的语法:
方法的类型 (返回值类型)方法名; - (void)display;
方法的类型 (返回值类型)方法名:(参数类型) 参数名 参数描述符:(参数类型) 参数名;

  1. .m 实现文件

作用:
1.为成员变量赋值
2.实现头文件中声明的属性和方法

语法:
@implementation 类名

@end

3.使用类
1)导入需要使用的头文件
2)实例化对象(alloc..init..)
3)调用方法(使用实例对象调用实例化,使用类对象调用类方法)
4)释放对象的所有权

4.访问成员变量的5种
1)getter/setter
2)自定义设置方法
3)自定义初始化方法
4)KVC
5)属性

5.自定义初始化方法
- (id)init{
self = [super init];
if(self){

}
return self;

}

id 通用指针 用于存储所有OC对象的实例
self 指向本类的指针
super 指向父类的指针
nil 空OC对象(等价于null)
YES/NO 真/假

第五章 继承

(1).前提:(三者满足其一)
1.子类拥有新的成员变量
2.子类拥有新的属性或方法
3.重写类父类的方法

(2).特性:
1.在OC使用“:”表示继承
2.OC中类使用单继承,继承关系简单
3.NSObject是所有OC对象的基类(原始类)

(3).继承中访问修饰符
@public 公有的 (少用) 能够在任何地方被访问
@protected 受保护的 能够在本类或其子类成员中被访问
@private 私有的 只能够在本类中被访问
@package (不用) 与操作系统相关的

注意:
1.子类可以继承父类中非私有的成员变量,和所有的属性、方法
2.@public访问修饰符尽量少用,因为它破坏了OC面向对象的思想

(4).补充:
1.
isMenberOfClass:
判断指定实例对象是否是Class的成员(指定对象是否是由Class创建)

isKindOfClass:
判断指定实例对象是否是Class的成员或子类(指定对象是否是由Class或其子类创建)

2.@class 前向声明(编译指令)
语法:@class (已有)类名;
作用:引入类
注意:
a.通过@class引入的类只能使用类名
b.@class只用于头文件中

第六章 封装

属性
@property 声明属性
@synthesize 实现属性
@dynamic 重写属性

注意:
1.在类外使用实例对象调用属性,在本类中使用self调用;
2.在类中直接声明属性,系统会为属性生产一个带”_”的(私有)成员变量

一、格式化字符串
NSInteger num1 = 100;
CGFloat num2 = 88.88;
NSString *str = @”测试”;

构建字符串的方法
NSString *string = [NSString stringWithFormat:@”%@:%li+%.2lf=%.2lf”,str,num1,num2,num1+num2];
NSLog(@”string [%@]”,string);

二、KVC
全称:Key-Value-Coding 键值编码

1.OC类型与C语言类型的相互转换

C -> OC
int num1 = 10;

id obj1 = @10;
id obj2 = @8.8f;
id obj3 = @(num1);

OC -> C

int num1 = [obj intValue];
CGFloat num2 = [obj doubleValue];
BOOL flag = [obj boolValue];
char ch = [obj charValue];

2.setValue:forKey: 设置方法
value 表示成员变量的值
key 表示成员变量的名称

3.获取方法
valueForKey:
valueForKeyPath:

注意:
1.使用KVC设置成员变量的值时:value值一定是OC类型的对象
2.使用KVC设置成员变量的值时:key的类型一定是NSString类型的,key对应的一定是类中的成员变量的名称
3.使用KVC注意C语言数据类型与OC数据类型的相互转换

三、属性
1.声明属性(为指定的成员变量声明getter、setter方法)
语法:@property (特性1,特性2,特性3) 类型名称 属性名;

属性的三大特性:
(1).readwrite,readonly 可操作性的
readwrite 可读可写的 (缺省)
readonly 只读的

(2).atomic,nonatomic 否是考虑线程安全性的
atoimic 原子性、需要考虑线程安全的 (缺省)
nonatomic 非原子性、不考虑线程安全的 (常用)

(3).assign,copy,retain 与内存管理相关的(重点)
assign 用于所有C语言类型 (缺省)
copy 用于NSString,NSNumber类型
retain 用于除NSString和NSNumber以外的所有OC类型

2.实现属性(实现getter、setter方法)
语法:@synthesize 属性名 = 成员变量名;

3.使用属性
Employee *emp = [[Employee alloc] init];

emp.name = @”张三”;
emp.age = 18;
emp.salary = 2000.0;

.语法

注意:
1.在OC中,.语法只适用于属性调用
2.属性在等号的左边表示赋值(setter)
3.属性在等号的右边表示取值(getter)

第七章 多态 ->多种形态

1.前提:
多态的实现必须使用继承来体现

2.多态在代码中的体现
使用父类的指针指向子类对象

为指针对象赋值本类的对象,则调用本类的方法
为指针对象赋值子类的对象,则调用子类的方法

3.定义
不同对象响应相同消息的能力就是多态

编译时、运行时?
编译时(cmd+B) 将源代码转换为计算机能够识别的内容(基于UNIX的可执行文件) ->OC编译器名称:LLVM
运行时(cmd+R) 将可执行文件加载到内存中,然后调用CPU进行运算,最后给出响应

动态类型、静态类型?
静态类型 类型在编译时被确定 (如:int、NSString)
动态类型 类型在运行时被确定 (如:id)

发送消息?
[obj message];向obj发送message消息
发送者 message实现(对应的代码块)
接收者 obj
消息 message

4.id与SEL类型
SEL 消息选择器 ->用于存储方法

得到选择器方法1
method1 = NSSelectorFromString(@”eat”);
得到选择器方法2
method2 = @selector(eat); //将eat方法转换成SEL类型

判断指定对象是否能够响应method选择器存储的方法
respondsToSelector:(SEL)

执行一个选择器
performSelector:(SEL)

SEL 选择器

(1)得到选择器
1.NSSelectorFromString(@”方法名字符串”);
2.@selector(方法名);

(2)得到选择器指定的方法
NSString name = NSStringFromSelector(SEL);

(3)判断指定对象是否能够响应选择器
BOOL flag = [emp respondsToSelector:method];

(4)执行选择器
执行一个无参的选择器
performSelector:(SEL)
执行带一个参数的选择器
performSelector:(SEL) withObject:(id)
执行带两个参数的选择器
performSelector:(SEL) withObject:(id) withObject:(id)

(5)通过类名字符串得到类对象
NSClassFromString(类名字符串);

(6)根据实例对象得到类名字符串
NSString *cattleClassName = [aCattle className];

(7)得到类的类对象
Class cls = [Cattle class];

类对象 Class
特性:
1.类对象存储了类的基本信息:类的名称、类的大小、类的版本、类的属性、方法
2.所有的实例对象都是由类对象创建
3.类对象在编译时被确定,在运行时被加载到内存
4.类对象只能调用类方法(静态方法),不能调用实例方法

注意:
1.id表示所有OC的实例对象,Class表示所有OC的类对象

调试(前提:添加断点)
图标1:进入下一个断点
图标2:执行当前方法的下一句 (单步跳过)
图标3:如果当前语句是方法,将单步执行方法内的第一行(单步进入)
图标4:单步返回

补充章 内存管理

内存带寛
1bit
8bit
32bit 4G
64bit 8G、16G

计算机组成:
CPU Intel(速龙、奔腾、赛扬、酷睿、i3、i5、i7)、AMD
内存
一级缓存
二级缓存
三级缓存

主板
显卡(集成、独立)、声卡、网卡
电源
鼠标、键盘
硬盘 (机械、固态SSD)
光驱、软驱

手机的九大模块:通信模块、存储模块、电源模块、SIM卡槽模块、输入模块、输出模块、近场通信模块、外部接口模块、主控制器模块

内存的硬件组成:内存颗粒…
内存的软件组成:代码区、数据区

数据区组成:
常量区 B 存储空间最小,效率最高 (如:100,18.88,”objecitve-c”)
全局、静态区 B 较小 (如:声明的全局变量、静态变量)
栈区 MB 较大 (如:局部变量、成员变量、参数) 有序的(先进后出、后进先出)
堆区 GB 最大 (使用alloc创建的对象) 无序的

指针:用于存储对象内存首地址

注意:
1.内存管理只需要管理堆中的内存
2.变量和指针所占的字节数都为4
3.OC是支持垃圾回收机制,iOS不支持

C语言的内存管理
原则:谁创建,谁释放

什么是内存
内存组成:代码区、数据区

数据区的组成:
常量区
全局、静态区
栈区 局部变量、成员变量、参数
堆区 alloc或malloc创建的对象

OC的内存管理只需要管理堆中的内存

OC的内存管理

一、黄金法则:
1.内存管理:你创建的对象,要负责管理(销毁)。

2.内存管理:
如果你使用关键字alloc、copy、new或retain来得到一个对象的所有权,
那你就有责任和义务使用release或autorelease来释放该对象的所有权。

二、内存管理的前提
内存管理只需要管理堆中的内存
内存管理对C语言基本类型无效
内存管理只管理继承自NSObject的对象

三、C语言的内存的缺点
int *p1 = malloc(10);
int *p2 = p1;

free(p2);
free(p1); 内存错误

四、引用计数 retainCount

alloc作用:
1.alloc是一个类方法
2.分配内存
3.将对象的引用计数设置为1
4.填充isa

retain 将对象的引用计数+1 多次调用

release 将对象的引用计数-1 多次调用

dealloc 销毁内存,引用计数为0时自动调用

注意:
1.只有继承自NSObject的对象才拥有引用计数
2.retainCount表示当前对象被引用的个数
3.OC的内存管理是基于对象的引用计数
4.最初对象的计数器是1
5.如果需要引用对象,可以给对象发送一个retain消息,这样对象计数器就加1
6.当不需要引用对象了,可以给对象发送release消息,这样对象计数器就减1
7.当计数器减到0,自动调用对象的dealloc函数,对象就会释放内存
8.计数器为0的对象不能在使用release和其他方法
9.retainCount只用在对象为nil时为0

前提:只用继承自NSObject的对象才进行内存管理

1.属性中的特性:assgin、copy、retain的作用(set方法的实现)
set方法的展开式
(1)retain:
- (void)setDog:(Dog *) aDog{ //aDog = _dog
if(_dog != aDog){
[_dog release];
_dog = [aDog retain];
}
}

(2)assign:
- (void)setDog:(Dog *) aDog{ //aDog = _dog
_dog = aDog;
}

(3)copy
- (void)setDog:(Dog *)aDog{ //aDog != _dog
_dog = [aDog copy];
}

注意:
1.使用assign声明的属性不需要管理内存
2.默认自定义的所有OC对象都不能使用copy,因为该对象没有实现NSCoping协议

2.自动释放池 autoreleasepool

autorelase 引用计数器在一个阶段结束后-1(延迟释放)

编译指令:@autoreleasepool{}

等价于
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
操作
[pool release];

总结:

一、OC的内存管理原则
OC的内存管理模型是基于对象的所有权。如果你拥有一个对象,那么你就有责任和义务去释放它,一个对象可以有多个拥有者——而且在其生命周期内必须有一个拥有者,否则系统将自动销毁该对象。

对于对象的所有权和释放权要求遵守以下四个原则:
1.任何你创建的对象都能获取其所有权,这里的创建包括alloc、new、copy等关键字;
2.还可以通过retain来获得一个对象的所有权,除了创建对象,获取对象所有权的唯一方法就是给该对象发送retain消息;
3.如果你不再需要一个对象,就必须释放其所有权,释放对象所有权可向对象发送release或autorelease消息;
4.不能释放非你所拥有对象的所有权。

二、引用计数
所有OC对象的创建和销毁都是基于引用计数:创建一个对象,引用计数为1,发送一次retain消息,引用计数+1,发送一次release消息,引用计数-1,发送一次autorelease消息,引用计数在某个阶段结束后-1,一旦一个对象的引用计数变为0,则系统自动销毁该对象。
查看一个对象的当前引用计数,即给对象发送retainCount消息,但正常情况下不可以使用这个方法来管理内存,一来显式的调用retainCount判断引用计数并加以控制就等于放弃了OC提供的内存管理模型,这个方法不仅低效而且容易发生问题;二来OC中内置的一些类为了效率等问题对retainCount会做特殊处理(如:NSString、NSNumber)。

三、自动释放池
对于OC来说,在每个事件循环中都会隐式的创建一个NSAutoReleasePool的实例,在事件循环结束式,发送release消息给该实例,该实例收到消息后就会遍历在自己生命周期内所有收到autorelease消息的对象,并给它们发送一个release消息,这个就实现了对象收到autorelease消息对象的内存管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值