OC总结

 类和对象是面向对象的核心。

 定义类,创建对象,使用对象。

 

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

 

 对象是类的实例, 类是对象的类型

 

 创建对象分两步:分配内存空间和初始化

 分配内存空间:根据类中声明的实例变量为对象分配内存,将所有实例变量置为默认值0,并返回首地              

            址。

 初始化:为对象的实例变量设置初始值。

 指针存储对象的首地址,代指对象。OC中使⽤指针代指对象,进行操作。

 

 OC中的⽅法分两种:类⽅法和实例方法

 类方法:只能类使用,例如:+(id)alloc :类方法中不能使用实例变量

 实例方法:只能对象使用,例如: -(void)sayHi

 

 类型标识,返回类型,参数类型,参数名,空格。例如:

 -(void)replaceObjectAtIndex:(NSString *) ;

 类中不能出现同名⽅方法。

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

 

 OC中使用消息发送机制:[receiver message] 正确表述:student对象发送sayHi消息。

 1student接收到消息,即方法sayHi; 

 2student找到sayHi方法,并执行。

 

 OC里规定了settergetter的书写格式。

 如果一个实例变量是int age;或者int _age; 

 setter的书写格式如下:- (void)setAge:(int)age;set+首字母大写的实例变量名(忽略下划线)

 getter的书写格式如下: - (int)age;即返回值类型与变量类型⼀致,方法名与实例变量名相同(忽略下划线)

 无论setter还是getter内部操作的是实例变量 每一个实例变量都需要一对settergetter方法。

 -(id)init 这个初始化方法只能给实例变量设置默认值,不灵活。

 -(id)initWithName: 自定义初始化方法,根据需求定义初始化⽅法。

 

 告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容。有效避免嵌套循环导入

 

 

 继承的上层:父类,继承的下层:子类。

 继承是单向的,不能相互继承。

 继承具有传递性:A继承于B,B继承于C,A具有BC的特征和⾏为。

 子类能继承父类全部的特征和行为。

 

 面向对象提供了继承语法,能⼤大简化代码。把公共的方法和实例变量写在父类里,子类只需要写⾃

 己独有的实例变量和方法即可。

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

 

 

 OC中只允许单继承。

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

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

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

 

 super是编译器指令,并⾮对象。 

 作用:super发消息,可以执⾏父类中实现的方法。

 

 初始化方法的主要作用是:为某些实例变量赋初值。

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

 

 子类定义了除父类中公共实例变量之外的实例变量。在自身的初始化方法中,优先向super发送init

 消息,初始化公共变量,初始化成功之后,再初始化自身特有变量,从⽽完成全部实例变量的初始化。

 

 子类内部实现:先执行super的初始化方法,再初始化⾃身变量,return self

 

 便利构造器内部实现:封装了alloc和初始化⽅方法。使用起来更加简洁。

 

 字符串、数组、字典都属于Foundation框架

 C语⾔言中,字符串是由char(ASCII)字符组成。

 OC,字符串是由unichar(Unicode)字符组成。

 

 不可变字符串的修改操作,本质就是得到一个新的字符串。

 不可变字符串的修改方法以string开头,有返回值。

 可变字符串的修改方法没有返回值,修改原字符串。

 

 iOS中存放数据的容器类都称为集合(collection) 

 数组是有序集合,只能存放对象 

 数组有下标(index)的概念,index来索引元素,下标从0开始。

 数组分不可变数组(NSArray)和可变数组(NSMutableArray)

 

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

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

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

 

 不可变字典一旦创建,键值对就不可更改,不可添加,不可删除。

 仅能读取key或者value

 

 集合中的元素唯一。

 存储的元素是无序的

 存储元素必须是对象类型

 

 数组枚举得到数组中的元素对象。 

 字典枚举得到字典中的key值。 

 集合枚举得到集合中的元素对象。

 

 block是匿名函数: 没有名称的函数


 因为Block是匿名函数, block变量存放的函数的实现, 通过block变量能直接实现调用函数


 block通常当参数来使⽤


 字⾯量创建的对象是便利构造的,且是不可变的


 无论你是哪个时区的时间,打印时总是打印对应的0时区时间。


 取两个时间对象的间隔:

 NSTimeinterval=[tomorrowDatetimeIntervalSinceDate:yesterdayDate];

 

 NSDateFormatteriOS中的日期格式类,功能是实现NSStringNSDate的互

 转。

 

 Category也叫分类或类⺫

 主要作用是为 没有源代码 的类添加⽅法。

 通过Category添加的⽅方法会成为原类的一部分。从⽽达到扩展一个类的功能。


 ⾯向对象编程也叫⾯向接⼝编程。


 Extension针对的是自⼰的类,必须有源代码的类

 

 协议是一套标准(一堆方法的声明),只有.h⽂件

 接受协议的对象实现协议中定义的方法

 

 协议中的方法默认是必须实现的

 

 遵守协议分两步

 1、在类的.h⽂件 ⽗类名后写上<协议名> 

 2、在.m文件中实现协议中的方法。

 

 Protocol的核⼼使⽤场景是实现delegate设计模式。

 

 Category能为没有源代码的类添加方法 

 Extension为类管理私有方法

 Protocoldelegate通常联合使用,iOS开发中特别常用。

 

 属性是Objective-C 2.0定义的语法,为实例变量提供了settergetter⽅法的默认实现

 

 属性的声明:使⽤@property声明属性
 例如:@property NSString *name;

 相当于@interface中声明了两个方法(settergetter):

 

 属性的实现:使用@synthesize实现属性
 例如:@synthesize name = _name;

 相当于@implementation实现了settergetter

 

 为属性提供了一些关键字⽤以控制settergetter的实现细节 

 这些关键字我们称为属性的属性(attribute) 

 一共3大类attribute

 

 第一类:读写性控制(readonlyreadwritesettergetter)

 readwrite是读写性控制的默认设置。

 

 第二类:原⼦子性控制(nonatomicatomic)

 atomicsettergetter⽅法在多线程访问下是绝对安全的,

  settergetter内部做了多线程访问处理。原⼦性控制的默认设置是 atomic

 

 nonatomic

 settergetter⽅方法内部不会做多线程访问处理,仅仅是普通的settergetter⽅方法

 

 程序开发过程中,settergetter处处都在用,如果使用atomic,需要不断的对settergette

 加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能。

 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic

 

 第三类:语义设置(assignretaincopy)

 assign:settergetter内部实现是直接赋值。

 retain, copy:settergetter内部实现会做内存优化。

 

 如果属性是非对象类型(比如int,float)属性的语义设置使用assign 

 如果属性是对象类型(⽐如NSStrngNSArray)属性的语义设置使用retain

 如果属性是对象类型并且想得到参数的copy,使⽤copy关键字。


 点语法是Objective-C 2.0中定义的语法格式。提供了一种便捷的属性访问方式

 凡是符合系统默认settergetter书写格式的方法都可以使用点语法。

 属性是一对gettersetter方法,点语法是属性的另一种调用格式。


 KVC(Key-Value-Coding),键值编码,是一种间接访问实例变量的方法。 

 key:,⽤于标识实例变量

 vlaue:实例变量对应的值

 

 key不存在的时候,会执行setValue:forUndefinedKey: 

 系统默认实现是抛出一个异常

 

 内存问题体现在两个方面:内存溢出、野指针异常。

 iOS给每个应用程序提供了一定的内存,用于程序的运行。一旦超出内存上限,程序就会Crash

 

 对象内存空间已经被系统回收,仍然使用指针操作这块内存。野指针异常是程序crash的主要原因

 代码量越⼤的程序,越难找出野指针的位置。


 OC采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,

 引用计数就递减。当引用计数到零时,该对象就将释放占有的资源。


 

 retain不同,一个对象想要copy,⽣成自己的副本,需要实现 NSCopying协议,定义copy的细节

 (如何copy)。如果类没有接受NSCopying协议而给对象发送copy消息,会引起crash

 不是任何对象都可以接收copy消息,只有接受了NSCopying协议的对象 才能接收copy消息。

 

 通常我们在dealloc中释放类的实例变量

 

 永远不要⼿手动调用dealloc. dealloc方法的最后一行,必须要写[super dealloc];

 

 collection会自主管理自己内部的元素


 加入collection中的对象会被retain

 移除出collection的对象会被release 

 collection被释放会对内部所有对象release

 

 多态:

 不同类型对象在响应同一个方法时的不同实现

 

 父类指针可以指向不同的子类对象

 允许在多个类中定义同一个消息接口。

 可以屏蔽不同子类对象之间的差异,写出通用代码。

 适应需求的不断变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值