黑马程序员——06-核心语法之二

一、构造方法

构造方法是用来初始化对象的方法,是对象方法 ,以 - 开头

1、对象创建过程

完整地创建一个可用对象可分为两步:

  •  分配存储空间  +alloc
  •  初始化   -init

示例:

创建对象:Person *p = [Person new];

拆分步骤:

1)、调用+alloc分配存储空间

Person *p1 = [Person alloc];

2)、调用-init进行初始化

Person *p2 = [p1 init];

进行合并后为

Person *p3 = [[person alloc] init];

 

2init方法的重写

重写构造方法目的:为了让对象创建出来,成员变量就会有一些固定的值

代码实现:


- (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”];

创建对象并初始化_namexiaoming

 

二、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)];




 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值