一、构造方法
构造方法是用来初始化对象的方法,是对象方法 ,以 - 开头
1、对象创建过程
完整地创建一个可用对象可分为两步:
- 分配存储空间 +alloc
- 初始化 -init
示例:
创建对象:Person *p = [Person new];
拆分步骤:
1)、调用+alloc分配存储空间
Person *p1 = [Person alloc];
2)、调用-init进行初始化
Person *p2 = [p1 init];
进行合并后为
Person *p3 = [[person alloc] init];
2、init方法的重写
重写构造方法目的:为了让对象创建出来,成员变量就会有一些固定的值
代码实现:
- (id)init
{
// 一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]
if(self != nil)
{
<span style="white-space:pre"> </span>// 如果对象初始化成功,才有必要对成员变量初始化
<span style="white-space:pre"> </span>_age = 10;
}
//返回一个已经初始化完毕的对象
return self;
}
Person *p4 = [[person alloc] init]; // 此时创建的对象中_age的初始值为10
以上代码可以简写为:
- (id)init
{
if(self = [super init])
{
_age = 10;
}
return self;
}
注意:
先调用父类的构造方法[super init],再进行子类内部成员变量的初始化
3、自定义构造方法
(1)自定义构造方法的规范
a) 一定是对象方法,以 - 开头
b) 返回值一般是id类型
c) 方法名一般以init开头
(2)代码示例:
- (id)initWithName : (NSString *)name
{
if(self = [super init])
{
_name = name;
}
return self;
}
Person *p = [[person alloc] initWithName :@”xiaoming”];
创建对象并初始化_name为xiaoming
二、Category-分类
1、分类作用
在不改变原来类内容的基础上,可以为类增加一些方法
2、格式
分类的声明
@interface类名 (分类名称)
// 方法声明
@end
分类的实现
@implementation类名 (分类名称)
// 方法实现
@end
示例:
@interface Person (YY)
- (void)study;
@end
@implementation Person (YY)
- (void)study
{
NSLog("好好学习!");
}
@end
3、使用注意:
- l 分类只能添加方法,不能增加成员变量
- l 分类方法实现中可以访问原来类中声明的成员变量
- l 方法同名调用的优先级:分类(最后参与编译的分类优先)→原来类→父类
- l 分类可以重新实现原来类中的方法,但会覆盖原来的方法,会导致原来的方法无法再使用,不推荐这么做
三、description方法
1、-description方法
NSLog(@”%@”,p);
默认情况下,使用NSLog和%@输出某个对象时,结果是:<类名:内存地址>
分析:
(1)会调用对象p的-description方法
(2)拿到-description方法的返回值(NSSting *)进行输出
(3) –description方法默认返回的类型是” 类名:内存地址”
2、+description方法
使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值(NSSting *)进行输出,默认输出结果为类名
3、修改NSLog的默认输出
若要输出我们想要的成员变量的值,需要在.m文件中对-description/+description方法重写
对-description方法重写示例:
- (NString *)description
{
return [NSString stringWithForma:@"age = %d,name = %@",_age,_name];
}
4、死循环陷阱
如果在-description方法中使用NSLog打印self会引起死循环2
四、NSLog输出增强示例
NSLog(@"%s",__func__); // 输出当前函数名
NSLog(@"%dn",__LINE__); // 输出行号
NSLog(@"%s\n",__FILE__); // 输出源文件名称
注:NSLog输出C语言字符串时不能有中文
五、SEL
1、方法的存储位置
每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的对象,根据一个SEL对象就可以找到方法的地址,进而调用方法
2、SEL对象的创建
SEL s = @selector(test);
SEL s2 = NSSelectorFromString(@"test");
3、SEL对象的其他用法
// 将SEL对象转为NSString对象
NSString *str = NSStringFromSelector(@selector(test));
Person *p = [Personnew];
// 调用对象p的test方法
[p performSelector:@selector(test)];