OC小结

第一节 类和对象

1.面向对象和面向过程的区别

>面向过程:分析解决问题的步骤特点,实现函数,依次调用函数。

>面向对象:分析某问题需要参与的对象,各个对象的作用,多个对象协作完成任务。

2.类和对象

>类和对象是面向对象的核心,定义类,创建对象,使用对象。

>类:具有相同的特征和行为的事物的抽象

>类和对象的关系

1)对象是类的实例

2)类是对象的类型

>定义类包括接口部分和实现部分

接口部分:@interface  @end 对外声明类的特征和行为

实现部分:@implementation    @end 对内实现行为(内部的具体实现)

>创建对象:

1)分配内存空间alloc

2)初始化init

>实例变量区分三度:@public @private @protected

public修饰的实例变量,可以直接使用“->”访问


第二节 实例变量可见度,方法

1.可见度

@public 共有的 实例变量可以在累的外部和内部操作(暴露类内部的细节,不符合封装原则

@protected 默认的 实例变量只能在该类和其子类内操作

@private 实例对象只能在该类内访问 内部指的是相应类的@implementation和@end内。

2.方法

1)类方法 方法类型标识符是+号 只能类使用

2)实例方法 方法类型标识符是-号 只能对象使用

注意:类中不能出现同名方法。

       “:”,标识参数,不能省略,有冒号,必须有参数。

>赋值和取值方法 setter和getter方法(成对存在)

>方法使用

消息发送机制:给类的对象发送方法的消息 类的对象接收到消息 然后找到该方法 并执行

>自定义初始化方法 

-(id)init;只能给实例变量初始化,不灵活。

-(id)initWIthName:(NSString *)name;自定义初始化方法,根据需求定义初始化方法。

>导入头文件

导入头文件中的类内容到当前的类可使用@class 类名;

导入头文件中的方法到当前的类中使用#import“类名”或者<类名>

     “  ”代表着导入自定义类

    < >代表着导入类库中的头文件

第三节 继承、初始化方法、便利构造器

1.继承

>上层是父类 下层是子类 

单向性:单向的,不能相互继承

传递性:A继承于B B继承于C,A具有B和C全部的特征和行为 (子类能继承父类的全部特征和行为)

>继承优点:既能保证类的完整,又能简化代码。

>特点:

1)OC中只允许单继承

2)没有父类的类成为根类,OC中的根类是NSObject(祖宗)

3)继承的内容:所有的实例变量和方法

4)如果子类不满意父类方法的实现,可以重写父类的方法。

2.初始化方法

>主要作用:为某些实力变量赋初值

初始化方法在对象的整个生命周期里只使用一次。

-(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;

3.便利构造器

1)封装了对象的创建过程

2)是一个类方法

3)可以有0到多个参数

4)内部实现:封装了alloc和初始化方法,使用起来更简洁。

>声明和实现便利构造器

+(id)personWithName:(NSString *)name

{

Person *p=[[Person alloc]initWithName:name];//封装alloc和初始化方法

return p;//返回本类型的实例

}

>使用便利构造器创建对象

Person *p=[Person personWithName:@"王小二"];

第四节 NSString NSArray NSNumber

1.NSString 

>创建字符串对象

>字符串的长度

>字符串的范围

NSRange是个结构体对象

>字符串的拼接,分割,替换

>字符串的比较,识别

>>>可变字符串NSMutableString

1)appendFormat拼接

2)insertString插入

3)deleteCHaractersInRange删除

4)setString替换

2.NSArray

>获取元素个数

>获取第一个元素

>获取最后一个元素

>>>NSMutableArray可变数组

1)addObject添加

2)insertObject插入

3)removeObjectAtIndex:1删除在index 1 上的元素

4)removeAllObjects删除全部

5)replaceObjectAtIndex:1 withObject:@“A” 替换

3.NSNumbe

常用方法

+numberWithInt

+numberWIthDouble

-intValue

-doublevalue

NSValue的常用方法

+valueWIthRange

+valueWIthPointer

-rangeValue

-pointerValue

第五节 集、字典、数组排序

1.集

>特点:

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];//将数组对象添加到集合中

2.字典

>字典:用于保存具有映射关系(key-value对)数据的集合

>字典是存储 key-value对的容器

>特点:

1)与数组不同,字典靠key存取元素。

2)存储的元素是无序的

3)key不能重复,value必须是对象。

4)键值对在字典中是无序存储的

5)字典分:不可变字典(NSDictionary)和可变字典(NSMutableDictionary)

NSDictionary:字典一旦创建,键值对就是不可更改,不可添加,不可删除,仅能读取key或者value

NSMutableDIctionary:可变字典 NSDictionary子类 可以对管理的键值对进行增删改

3.数组排序

>枚举类型:

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后面加个-号就是降序了

}];

第七节 类目、延展、协议

1.类目

类目就是为已存在的类添加新的方法,不能添加实例变量。

@interface NSString(sayHi) 

-(void)sayHello;

@end

>sayHi  是类目名

>sayHello 是新的方法

>NSString 是已存在的类

#import后主函数main可以直接调用sayHello方法

添加变量或重载原始类的方法,可以通过继承创建子类实现。

2.延展

>作用:定义自己的私有方法

>直接放到需要扩展的类的.m文件中即可。

#import"Person.h"

@interface Person(extension)

-(void)sayHi;//Student类创建一个私有的方法

@end


@implementation Student

-(void)hello

{

[self sayHi];

}

-(void)sayHi;

{

NSLog(@"你好");

}

@end

3.协议

>协议声明方法,协议不必实现,该方法可以被其他类实现。

>协议不是类,是一个接口。

第八节属性

1.属性

>属性是OC2.0定义的语法,为实例变量提供了setter和getter方法的默认实现。

>能再一定程度上简化程序代码,并且增加了实例变量的访问安全性。

>属性:@property 声明属性

例如:@property NSString* name;

相当于@interface中声明了两个方法。

2.属性的属性

>目的:简化程序员编码

>属性的属性attribute分三类

1)读写性控制 randly readwrite(默认设置) 

2)原子性控制nonatomic(通常设置)atomic(默认设置)

3)语义设置 assign(非对象类型 没有*号就是) retain(对象类型 加*的) copy(对象类型 必须遵守NSCopying协议)

3.点语法

>提供了一种便捷的属性访问方式

>符合系统默认setter getter书写格式的方法都可以使用点语法。

>[person setName:"Zhangsan"];

等价于person.name=@"Zhangsan";

NSString *name=[person name];

等价于NSString *name=person name;

4.KVC

>key-value-coding 键值编码

>key标识实例变量

>value实例变量对应的值

>修改值

setValue:  forKey:

setValue: forKeyPah:

setValue: forUndefinedKey;

setValue: forKwyWithDictionary:

>获取值

valueForKey:

valueForKeyPath:

valueForUndefinedKey:

>当key不存在时,会执行setValue:  forUndefinedKey: 系统默认实现是抛出一个异常

第九节 内存管理初级

1.内存问题

>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];

}

2.释放池

>autorelease的使用

通过autoreleasepool控制 autorelease对象的释放

向一个对象发送autorelease消息,这个对象何时释放,取决于autoreleasepool。

>创建释放池

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];

Person *p=[[Person alloc]init];

[p autorelease];//必须写在创建和销毁中间

>销毁释放池 

[pool release];

越晚autorelease的对象越早收到release消息。

3.深拷贝和浅拷贝

>深拷贝:

-(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];

}

>区别:

深拷贝拷贝的是对象

但是浅拷贝拷贝的是指针。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值