>面向过程:分析解决问题的步骤特点,实现函数,依次调用函数。
>面向对象:分析某问题需要参与的对象,各个对象的作用,多个对象协作完成任务。
>类和对象是面向对象的核心,定义类,创建对象,使用对象。
>类:具有相同的特征和行为的事物的抽象
>类和对象的关系
1)对象是类的实例
2)类是对象的类型
>定义类包括接口部分和实现部分
接口部分:@interface @end 对外声明类的特征和行为
实现部分:@implementation @end 对内实现行为(内部的具体实现)
>创建对象:
1)分配内存空间alloc
2)初始化init
>实例变量区分三度:@public @private @protected
public修饰的实例变量,可以直接使用“->”访问
@public 共有的 实例变量可以在累的外部和内部操作(暴露类内部的细节,不符合封装原则)
@protected 默认的 实例变量只能在该类和其子类内操作
@private 实例对象只能在该类内访问 内部指的是相应类的@implementation和@end内。
1)类方法 方法类型标识符是+号 只能类使用
2)实例方法 方法类型标识符是-号 只能对象使用
注意:类中不能出现同名方法。
“:”,标识参数,不能省略,有冒号,必须有参数。
>赋值和取值方法 setter和getter方法(成对存在)
>方法使用
消息发送机制:给类的对象发送方法的消息 类的对象接收到消息 然后找到该方法 并执行
>自定义初始化方法
-(id)init;只能给实例变量初始化,不灵活。
-(id)initWIthName:(NSString *)name;自定义初始化方法,根据需求定义初始化方法。
>导入头文件
导入头文件中的类内容到当前的类可使用@class 类名;
导入头文件中的方法到当前的类中使用#import“类名”或者<类名>
“ ”代表着导入自定义类
< >代表着导入类库中的头文件
>上层是父类 下层是子类
单向性:单向的,不能相互继承
传递性:A继承于B B继承于C,A具有B和C全部的特征和行为 (子类能继承父类的全部特征和行为)
>继承优点:既能保证类的完整,又能简化代码。
>特点:
1)OC中只允许单继承
2)没有父类的类成为根类,OC中的根类是NSObject(祖宗)
3)继承的内容:所有的实例变量和方法
4)如果子类不满意父类方法的实现,可以重写父类的方法。
>主要作用:为某些实力变量赋初值
初始化方法在对象的整个生命周期里只使用一次。
-(id)initWithName
{
self=[super init];//给super发送init消息:即执行父类中实现的方法
if(self)
{
_name=name;//初始化设置
}
return self;//返回初始化完成的对象
}
>特征:
1)初始化方法是实例方法(对象调用的方法)
2)id或者instancetype类型的返回值
3)以init开头
4)可以带0到多个参数
5)内部实现:先执行super的初始化方法,再初始化自身变量,return self;
1)封装了对象的创建过程
2)是一个类方法
3)可以有0到多个参数
4)内部实现:封装了alloc和初始化方法,使用起来更简洁。
>声明和实现便利构造器
+(id)personWithName:(NSString *)name
{
Person *p=[[Person alloc]initWithName:name];//封装alloc和初始化方法
return p;//返回本类型的实例
}
>使用便利构造器创建对象
Person *p=[Person personWithName:@"王小二"];
>创建字符串对象
>字符串的长度
>字符串的范围
NSRange是个结构体对象
>字符串的拼接,分割,替换
>字符串的比较,识别
>>>可变字符串NSMutableString
1)appendFormat拼接
2)insertString插入
3)deleteCHaractersInRange删除
4)setString替换
>获取元素个数
>获取第一个元素
>获取最后一个元素
>>>NSMutableArray可变数组
1)addObject添加
2)insertObject插入
3)removeObjectAtIndex:1删除在index 1 上的元素
4)removeAllObjects删除全部
5)replaceObjectAtIndex:1 withObject:@“A” 替换
常用方法
+numberWithInt
+numberWIthDouble
-intValue
-doublevalue+valueWIthPointer
-rangeValue
-pointerValue
>特点:
1)与数学中的集合一样,集合中的元素唯一。
2)存储的元素是无序的
3)存储元素必须是对象类型
NSSet:不可变集合
>方法:
[set count];//打印集合的个数
[set anyObject];//随机获取一个元素
BOOL a=[set containObject:@"a"];//判断集合中是否包含某个元素
NSArray *array=[set allObjects];//将集合中的元素添加到数组中
NSMutableSet:可变集合
>方法
NSMutableSet *set1=[NSMutableSet set];//新建一个集合1
[set1 addObjectsFromArray:array];//将数组对象添加到集合中
[set1 addObject:@"t"];//添加字符串对象到集合中
[set1 removeObject:@"a"];//从集合中删除一个对象
[set1 removeAllObjects];//从集合中删除全部对象
NSMutableSet *set2=[NSMutableSet set];//新建一个集合2
[set2 setSet:set1]//将set2清空,再将set1添加到set2中 将集合对象添加到集合中
NSMutableSet *set3=[NSMutableSet set];//新建一个集合3
[set3 addObjectsFromArray:array];//将数组对象添加到集合中
>字典:用于保存具有映射关系(key-value对)数据的集合
>字典是存储 key-value对的容器
>特点:
1)与数组不同,字典靠key存取元素。
2)存储的元素是无序的
3)key不能重复,value必须是对象。
4)键值对在字典中是无序存储的
5)字典分:不可变字典(NSDictionary)和可变字典(NSMutableDictionary)
NSDictionary:字典一旦创建,键值对就是不可更改,不可添加,不可删除,仅能读取key或者value
NSMutableDIctionary:可变字典 NSDictionary子类 可以对管理的键值对进行增删改
>枚举类型:
for (<#type *object#> in <#collection#>) {
<#statements#>
}
1>object是遍历得到的元素对象
2>collection是集合类型的对象:数组,字典,集合。
特点:
1)数组枚举得到数组中的元素对象
2)字典枚举得到字典中的key值
3)集合枚举得到集合中的元素对象
数组排序:
[array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
[array count];
[array sortedArrayUsingSelector:<#(SEL)#>];
[mutableArray sortUsingSelector:<#(SEL)#>];
@selector为了获取方法名,数组中元素的方法。
NSCountedSet *set4=[NSCountedSet setWithObjects:@"金科",@"金科",@"王",nil];
NSUInteger i=[set4 countForObject:@"金科"];//
第六节 Block 高级数组
1.Block
声明Block
int(^myBlock)(int,int);
>int 返回值
>^myBlock中^脱字符:标识这后面的sumBlock是一个Block变量
>int,int参数类型
>分为四种:
有返回值,有参数 int(^myBlock)(int,int)=^(int a,int b){};
无返回值,有参数void(^myBlock)(int,int)=^(int a,int b){};
有返回值,无参数int(^myBlock)(void)=^(void){};
无返回值,无参数void(^myBlock)(void)=^(void){};
>局部变量和全局变量
__block int num2=7;
用__block修饰的局部变量(Block外)的可以在Block修改,相当于把要修改的数值拷贝到Block中。
>Block方法排序
NSMutableArray *array=[[NSmutableArray alloc]init];
[array sortUsingComparator:NSComparisonResult(Student *obj1,Student *obj2){
return [[obj1 name]compare:[obj2 name]];//升序 在return后面加个-号就是降序了
}];
类目就是为已存在的类添加新的方法,不能添加实例变量。
@interface NSString(sayHi)
-(void)sayHello;
@end
>sayHi 是类目名
>sayHello 是新的方法
>NSString 是已存在的类
#import后主函数main可以直接调用sayHello方法
添加变量或重载原始类的方法,可以通过继承创建子类实现。
>作用:定义自己的私有方法
>直接放到需要扩展的类的.m文件中即可。
#import"Person.h"
@interface Person(extension)
-(void)sayHi;//Student类创建一个私有的方法
@end
@implementation Student
-(void)hello
{
[self sayHi];
}
-(void)sayHi;
{
NSLog(@"你好");
}
@end
>协议声明方法,协议不必实现,该方法可以被其他类实现。
>协议不是类,是一个接口。
>属性是OC2.0定义的语法,为实例变量提供了setter和getter方法的默认实现。
>能再一定程度上简化程序代码,并且增加了实例变量的访问安全性。
>属性:@property 声明属性
例如:@property NSString* name;
相当于@interface中声明了两个方法。
>目的:简化程序员编码
>属性的属性attribute分三类
1)读写性控制 randly readwrite(默认设置)
2)原子性控制nonatomic(通常设置)atomic(默认设置)
3)语义设置 assign(非对象类型 没有*号就是) retain(对象类型 加*的) copy(对象类型 必须遵守NSCopying协议)
>提供了一种便捷的属性访问方式
>符合系统默认setter getter书写格式的方法都可以使用点语法。
>[person setName:"Zhangsan"];
等价于person.name=@"Zhangsan";
NSString *name=[person name];
等价于NSString *name=person name;
>key-value-coding 键值编码
>key标识实例变量
>value实例变量对应的值
>修改值
setValue: forKey:
setValue: forKeyPah:
setValue: forUndefinedKey;
setValue: forKwyWithDictionary:
>获取值
valueForKey:
valueForKeyPath:
valueForUndefinedKey:
>当key不存在时,会执行setValue: forUndefinedKey: 系统默认实现是抛出一个异常
>90%以上的闪退原因是内存问题
>内存问题体现在2个方面:内存溢出(使用内存超出内存上限)和野指针异常(主要原因)(对象内存空间已经被系统回收仍然使用,指针操作这块内存)
>内存管理方式:
1)垃圾回收:系统自动完成垃圾回收
2)MRC:(Manual Reference Count)手动 内存管理机制是:引用计数
3)ARC:(Auto Reference Count)自动 基于MRC的
>引用基数:当一个新的引用指向对象时引用计数器递增,当去掉一个引用时,引用计数到0时,该对象就释放占有的资源。
>影响引用计数的方法
+alloc 开辟内存空间,让被开辟的内存空间的引用计数变为1
-retain 引用计数加1
-copy
-release 引用基数-1 如果本来为1,release之后变为0 内存被系统回收
-autorelease 未来的某一时刻引用计数-1
>-dealloc和alloc相反 当对象的引用计数为0的时候,由对象自动调用。
-(void)dealloc
{
[super dealloc];
}
>autorelease的使用
通过autoreleasepool控制 autorelease对象的释放
向一个对象发送autorelease消息,这个对象何时释放,取决于autoreleasepool。
>创建释放池
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
Person *p=[[Person alloc]init];
[p autorelease];//必须写在创建和销毁中间
>销毁释放池
[pool release];
越晚autorelease的对象越早收到release消息。
>深拷贝:
-(id)copyWithZone:(NSZone*)zone{
Person *p=[[Person allocWithZone:zone]init];
p.age=self.age;
p.name=slef.age;
return p;
}
>浅拷贝:
-(id)copyWithZone:(NSZone*)zone{
return[self retain];
}
>区别:
深拷贝拷贝的是对象
但是浅拷贝拷贝的是指针。
略。