<1>id类型
1. 是一个万能指针,可以指向/操作任何一个OC对象
2. id类型的变量本身就是一个指针类型
<2>构造方法
1. new方法的实现实际上是分为两步的,1.分配存储空间,调用+alloc方法;2.初始化,调用-init方法
1>调用+alloc方法
Person *p1 = [Person alloc];
2>Person *p2 = [p1 init];
但可以写成下面的一句(以后会经常这样写,中括号套一个中括号,而且new就不常用了)
Person *p = [[Person alloc] init]; // 这个init就是构造方法
构造方法: 用来初始化对象的方法,是一个对象方法
(在需要的类中)重写-init方法: - (id)init**** //有固定的格式,如下:
// 1.一定要先调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; // 当前对象 self
// 2.如果初始化成功,才有必要进行接下来的初始化
if(self != nil){ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
可以进一步压缩代码长度
if(self = [super init]){
_age = 10;
}
return self;
这时候调用这个重写后的init方法,每个新创建的对象的 _age 都是 10。
重写构造方法的目的:为了让对象被创建出来的时候,它的成员变量就会有一些固定的值
2. 重写构造方法的注意点:
1>先调用父类的构造方法([super init])
2>再进行子类内部成员变量的初始化
3. 如果子类和父类有相同的方法,优先调用子类的方法,这时又会调用父类的init([super init]吗,一级一级往上调,一直调到NSObject根类为止),然后再一级一级的回到原始地方,[有点像递归] [基础0808-构造方法1------35:35——39:20以及构造方法2的前10分半钟]
4. 可以使用Xcode的断点功能来跟踪程序流程
5. 成员变量统统以下划线开头
<3>自定义构造方法
1. 自定义构造方法的规范:
1>一定是对象方法
2>返回值一般是id类型
3>方法名一般以initWith开头
2. 哪个类的属性就交给哪个类的方法来实现,各管各的,不要插手别人的事,面向对象的思想
<4>分类(OC特有的语法) Category:分类,类别,类目
1. 分类的作用:可以给某一个类扩充一些方法(在不修改原来类的代码文件,不建立继承关系的前提下)另建一个文件(类),如果要用到这个类里的方法,就要包含该类的头文件,格式:
//声明
@interface 被扩充的类的类名 (分类名称)
@end
//实现
@implementation 被扩充的类的类名 (分类名称)
@end
2. 分类的文件名就是”被扩充类的类名+分类名称.h” ”被扩充类的类名+分类名称.m”
3. 使用注意
1>分类只能增加方法,不能增加成员变量
2>分类的方法实现中可以访问原来类中声明的成员变量
3>分类可以重新实现被扩充类中的方法,但是会覆盖掉原来类中的方法,会导致原来的方法没法再使用
4>方法调用的优先级:分类 —-> 被扩充类 —-> 父类
5>如果两个分类中有相同的方法,使用谁,取决于最后编译谁(跟编译顺序有关,这个可以在Xcode中查看)
4. 编译只编译源文件 .m/.c .h文件是不编译的
5. 给系统自带的类添加分类,因为开发中系统自带的类不能满足我们的需求
.这里的一个例子是计算一个字符串中有几个数字,所以要建立NSString类的一个分类,特别的再记录一下,字符串本身也是一个对象
6. 网上有很多的开源的类库,这些类都是一些写好的针对不同需求的分类
1. 是一个万能指针,可以指向/操作任何一个OC对象
2. id类型的变量本身就是一个指针类型
<2>构造方法
1. new方法的实现实际上是分为两步的,1.分配存储空间,调用+alloc方法;2.初始化,调用-init方法
1>调用+alloc方法
Person *p1 = [Person alloc];
2>Person *p2 = [p1 init];
但可以写成下面的一句(以后会经常这样写,中括号套一个中括号,而且new就不常用了)
Person *p = [[Person alloc] init]; // 这个init就是构造方法
构造方法: 用来初始化对象的方法,是一个对象方法
(在需要的类中)重写-init方法: - (id)init**** //有固定的格式,如下:
// 1.一定要先调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; // 当前对象 self
// 2.如果初始化成功,才有必要进行接下来的初始化
if(self != nil){ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
可以进一步压缩代码长度
if(self = [super init]){
_age = 10;
}
return self;
这时候调用这个重写后的init方法,每个新创建的对象的 _age 都是 10。
重写构造方法的目的:为了让对象被创建出来的时候,它的成员变量就会有一些固定的值
2. 重写构造方法的注意点:
1>先调用父类的构造方法([super init])
2>再进行子类内部成员变量的初始化
3. 如果子类和父类有相同的方法,优先调用子类的方法,这时又会调用父类的init([super init]吗,一级一级往上调,一直调到NSObject根类为止),然后再一级一级的回到原始地方,[有点像递归] [基础0808-构造方法1------35:35——39:20以及构造方法2的前10分半钟]
4. 可以使用Xcode的断点功能来跟踪程序流程
5. 成员变量统统以下划线开头
<3>自定义构造方法
1. 自定义构造方法的规范:
1>一定是对象方法
2>返回值一般是id类型
3>方法名一般以initWith开头
2. 哪个类的属性就交给哪个类的方法来实现,各管各的,不要插手别人的事,面向对象的思想
<4>分类(OC特有的语法) Category:分类,类别,类目
1. 分类的作用:可以给某一个类扩充一些方法(在不修改原来类的代码文件,不建立继承关系的前提下)另建一个文件(类),如果要用到这个类里的方法,就要包含该类的头文件,格式:
//声明
@interface 被扩充的类的类名 (分类名称)
@end
//实现
@implementation 被扩充的类的类名 (分类名称)
@end
2. 分类的文件名就是”被扩充类的类名+分类名称.h” ”被扩充类的类名+分类名称.m”
3. 使用注意
1>分类只能增加方法,不能增加成员变量
2>分类的方法实现中可以访问原来类中声明的成员变量
3>分类可以重新实现被扩充类中的方法,但是会覆盖掉原来类中的方法,会导致原来的方法没法再使用
4>方法调用的优先级:分类 —-> 被扩充类 —-> 父类
5>如果两个分类中有相同的方法,使用谁,取决于最后编译谁(跟编译顺序有关,这个可以在Xcode中查看)
4. 编译只编译源文件 .m/.c .h文件是不编译的
5. 给系统自带的类添加分类,因为开发中系统自带的类不能满足我们的需求
.这里的一个例子是计算一个字符串中有几个数字,所以要建立NSString类的一个分类,特别的再记录一下,字符串本身也是一个对象
6. 网上有很多的开源的类库,这些类都是一些写好的针对不同需求的分类