重写构造方法,使得对象创建出来的时候就有初值
//不带参数
- ( instancetype ) init
{
// 先调用父类的init初始化方法,返回地址给当前对象(是赋值(=)不是等于(==),然后判断当前对象是否为空(nil),若不为空,则说明初始化成功,继续对成员变量赋值;反之,则不成功,返回当前对象直接退出
//谁的成员变量,谁就进行初始化(子类新添加的成员变量自己初始化,从父类继承的由父类继承)
if(self = [super init])
{
self.name = @“马化腾”;
self.age = 40;
self.height = 178;
}
return self;
}
//带参数
- (instancetype) initWithName:(NSString *) name andAge:(int) age andHeight:(float) height
{
if(self = [super init])
{
self.name = name;
self.age = age;
self.height = height;
}
return self;
}
注:初始化方法一般都以init开头,增加代码可读性,便于同事之间交流,称为init家族方法
2、分类
1、分类的作用
分类:可以给某一个类扩充一些方法(不修改原来类的代码)
在不修改原来类内容的前提下,给类扩充方法有2中方法:1>继承;2>分类(Category)
Category格式:
(1)分类的声明:
@interface 类名(分类名称)
方法声明
@end
#import "ZYPerson.h"
@interface ZYPerson (ZY)
- (void) printName;
@end
(2)分类的实现
@implementation 类名(分类名称)
//方法实现
@end
#import "ZYPerson+ZY.h"
@implementation ZYPerson (ZY)
- (void) printName
{
NSLog(@"我的名字是(ZY):%@", self.name);
}
@end
2、使用注意
(1)Category可以访问原来类的实例变量,但不能添加变量,只能添加方法。如果想增加成员变量可以考虑通过继承创建子类
(2)分类方法中可以访问原来类中声明的成员变量
(3)Category可以重新实现原来类中的方法,但会覆盖掉原来的方法,导致原来的方法失效,因此不推荐这么做
(4)方法调用的优先级:
1>分类(最后参与编译的分类优先执行)
2>原来类
3>父类
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
3、好处
(1)一个庞大的类可以分模块开发
(2)一个庞大的类可以由多个人来编写,更有利于团队合作
3、SEL(消息机制)
//类的声明
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void) test;
@end
//类的实现
@implementation Person
- (void) test
{
NSLog(@"调用了test方法---");
//传入_cmd,表示调用当前方法,会产生死循环
//[self performSelector:_cmd];
}
@end
//程序入口
#import <Foundation/Foundation.h>
#import "Person.h"
//先把方法包装成一个SEL数据,然后通过这个数据找到方法所在的地址,进而调用方法
int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];
[p test];
// SEL s2 = @selector(test);
// [p performSelector:s2];
// SEL s = NSSelectorFromString(@"test"); 字符串转SEL数据
// NSString *s1 = NSStringFromSelector(@selector(test)); SEL数据转字符串
// [p performSelector:s];
// NSLog(@"%@", s1);
return 0;
}