-----------android培训、java培训、java学习型技术博客、期待与您交流!----------
今天我学习了OC核心语法的第二部分,内容比较重要,以下是学习内容:
1.什么是构造方法:用来初始化对象的方法,是个对象方法,以-开头
2.重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
3.重写构造方法的注意点
1)先调用父类的构造方法([super init])
2)再进行子类内部成员变量的初始化
用下面例子来说明构造方法:
Person *p = [Person new];
上面创建对象的过程实际上可以分为两步:
1.分配存储空间 +alloc//是一个类方法
2.初始化 -init //是一个对象方法
1.调用+alloc分配存储空间
Person *p1 = [Person alloc];
2.调用-init进行初始化
Person *p2 = [p1 init];
4.重写init方法:
如果想让对象在创建的时候,就使得成员对象中的值获得一定的数字,我们需要哦重写init方法:
重写-init方法
- (id)init
{
// 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; //当前对象 self
// 2.如果对象初始化成功,才有必要进行接下来的初始化
if (self != nil)
{ //初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
}
5.自定义构造方法:
自定义构造方法的规范
1.一定是对象方法,一定以 -开头
2.返回值一般是id类型
3.方法名一般以initWith开头
例如:
- (id)initWithNo:(int)no
{
if ( self = [super init] )
{
_no = no;
}
return self;
}
6. 分类的学习:
1)分类的作用:
在不改变原来类内容的基础上,可以为类增加一些方法
2)使用注意:
1.分类只能增加方法,不能增加成员变量
2.分类方法实现中可以访问原来类中声明的成员变量
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
4.方法调用的优先级:分类(最后参与编译的分类优先) -->原来类 --> 父类
例如:
int main()
{
Person *p = [[Person alloc] init];
p.age = 10;
//优先去分类中查找,然后再去原来类中找,最后再去父类中找
[p test];
return 0;
}
7.类本质的学习:
类的本质也是一个对象,是Class类型的对象,简称类对象:
1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。
2.当第一次使用某个类时,就会调用当前类的+initialize方法
3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)
先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)
如下:
//当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法
+ (void)load
{
NSLog(@"Person---load");
}
//当第一次使用这个类的时候,就会调用一次+initialize方法
+ (void)initialize
{
NSLog(@"Person-initialize");
}
8.NSLog的学习:
默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址>
1.会调用对象p的-description方法
2.拿到-description方法的返回值(NSString *)显示到屏幕上
3.-description方法默认返回的是“类名+内存地址”
9.SEL的学习:
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,实际上消息就是SEL.
下面是具体过程:
1.把方法名包装成SEL类型的数据
2.根据SEL数据找到对应的方法地址
3.根据方法地址调用对应的方法
总结:
今天重点内容在构造方法上面,尤其是init的构造,要细细体会.