类和对象是面向对象的核心。
定义类,创建对象,使用对象。
类:具有相同特征和行为的事物的抽象。
对象是类的实例, 类是对象的类型
创建对象分两步:分配内存空间和初始化
分配内存空间:根据类中声明的实例变量为对象分配内存,将所有实例变量置为默认值0,并返回首地
址。
初始化:为对象的实例变量设置初始值。
指针存储对象的首地址,代指对象。OC中使⽤指针代指对象,进行操作。
OC中的⽅法分两种:类⽅法和实例方法
类方法:只能类使用,例如:+(id)alloc 注:类方法中不能使用实例变量
实例方法:只能对象使用,例如: -(void)sayHi
类型标识,返回类型,参数类型,参数名,空格。例如:
-(void)replaceObjectAtIndex:(NSString *) ;
类中不能出现同名⽅方法。
“ : ” 标识参数,不能省略。有冒号必须有参数。
在OC中使用消息发送机制:[receiver message]。 正确表述:给student对象发送sayHi消息。
1、student接收到消息,即方法sayHi;
2、student找到sayHi方法,并执行。
OC里规定了setter和getter的书写格式。
如果一个实例变量是int age;或者int _age;
setter的书写格式如下:- (void)setAge:(int)age;即set+首字母大写的实例变量名(忽略下划线)。
getter的书写格式如下: - (int)age;即返回值类型与变量类型⼀致,方法名与实例变量名相同(忽略下划线)
无论setter还是getter内部操作的是实例变量 每一个实例变量都需要一对setter和getter方法。
-(id)init 这个初始化方法只能给实例变量设置默认值,不灵活。
-(id)initWithName: 自定义初始化方法,根据需求定义初始化⽅法。
告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容。有效避免嵌套循环导入
继承的上层:父类,继承的下层:子类。
继承是单向的,不能相互继承。
继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和⾏为。
子类能继承父类全部的特征和行为。
面向对象提供了继承语法,能⼤大简化代码。把公共的方法和实例变量写在父类里,子类只需要写⾃
己独有的实例变量和方法即可。
继承既能保证类的完整,又能简化代码。
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];
NSDateFormatter是iOS中的日期格式类,功能是实现NSString和NSDate的互
转。
Category也叫分类或类⺫
主要作用是为 没有源代码 的类添加⽅法。
通过Category添加的⽅方法会成为原类的一部分。从⽽达到扩展一个类的功能。
⾯向对象编程也叫⾯向接⼝编程。
Extension针对的是自⼰的类,必须有源代码的类
协议是一套标准(一堆方法的声明),只有.h⽂件
接受协议的对象实现协议中定义的方法
协议中的方法默认是必须实现的
遵守协议分两步
1、在类的.h⽂件 ⽗类名后写上<协议名>。
2、在.m文件中实现协议中的方法。
Protocol的核⼼使⽤场景是实现delegate设计模式。
Category能为没有源代码的类添加方法
Extension为类管理私有方法
Protocol和delegate通常联合使用,是iOS开发中特别常用。
属性是Objective-C 2.0定义的语法,为实例变量提供了setter、getter⽅法的默认实现
属性的声明:使⽤@property声明属性
例如:@property NSString *name;
相当于@interface中声明了两个方法(setter、getter):
属性的实现:使用@synthesize实现属性
例如:@synthesize name = _name;
相当于@implementation实现了setter、getter
为属性提供了一些关键字⽤以控制setter、getter的实现细节
这些关键字我们称为属性的属性(attribute)
一共3大类attribute。
第一类:读写性控制(readonly、readwrite、setter、getter)
readwrite是读写性控制的默认设置。
第二类:原⼦子性控制(nonatomic、atomic)
atomic。setter、getter⽅法在多线程访问下是绝对安全的,
即 setter、getter内部做了多线程访问处理。原⼦性控制的默认设置是 atomic
nonatomic。
setter、getter⽅方法内部不会做多线程访问处理,仅仅是普通的setter、getter⽅方法
程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、gette
加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能。
通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
第三类:语义设置(assign、retain、copy)
assign:setter、getter内部实现是直接赋值。
retain, copy:setter、getter内部实现会做内存优化。
如果属性是非对象类型(比如int,float等)属性的语义设置使用assign。
如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设置使用retain。
如果属性是对象类型并且想得到参数的copy,使⽤copy关键字。
点语法是Objective-C 2.0中定义的语法格式。提供了一种便捷的属性访问方式
凡是符合系统默认setter、getter书写格式的方法都可以使用点语法。
属性是一对getter、setter方法,点语法是属性的另一种调用格式。
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
多态:
不同类型对象在响应同一个方法时的不同实现
父类指针可以指向不同的子类对象
允许在多个类中定义同一个消息接口。
可以屏蔽不同子类对象之间的差异,写出通用代码。
适应需求的不断变化