@class 用在两个类交叉去声明的时候,只是声明类,如果用到类中的方法,就要去用#import来导入头文件。
id类型---相当于void*, 通用的指针类型,可以指向任意对象。本身就是指针类型,所以定义的时候不需要加上* 例如: id new=[类名 new]; 也可以用在:类名 *new=[类名 new]; id newone=new; 然后newone就可以调用类中的对象方法。 一般用于返回值和参数不确定的时候。
类的构造方法:(初始化方法)
TYPerson *new=[TYPerson new];分配空间,把空间中数据全部清空
把上面的创建对象拆分
1.分配空间 alloc是类方法
TYPeron *p1=[TYPerson alloc];
2.初始化 init是对象方法
TYPerson *p=[p1 init];
如果不想清空空间,可以自己来写init方法.
复写init方法的要求:必须调用父类的init方法,判断self是否为空,不为空则给成员属性赋值。
-(id)init{
self=[super init];
if(self){
self->_name=@"haha";
self->_age=10;
}
return self;
}
定义一个类 Person *new=[[Person alloc]init];
-(id)initwithname:(NSStirng *)name init_age:(int)age{
self=[super init];
if(self){
self->_name=name;
self->_age=age;
}
return self;
}
Person *newperson=[[Person alloc]initwithname:@"hehe" init_age:10];
SEL变量:SEL method=@selector(方法名);Person *p=[[Person alloc]init]; 判断p能否执行method的方法
if(p respondsToSelector:method)//返回值是YES/NO
如果是YES,则调用[p performSelector:method];
带三个参数的做法:写成一段字符串,然后通过string的方法分割开,再用数组存起来,再输出出来
NSString *str=[NSString stringWithFormat:@"%@:%@:%d",name,sex,age];
p=[ performSelector:@selector(show:)withObject:str];
NSArray *array=[p componentSeparatedByString;@":"];
SEL s2=@selector(showmsg:);
if ([new respondsToSelector:s2]) {
NSString *str=[NSString stringWithFormat:@"%@:%i:%f",new._name,new._age,new._height];
[new performSelector:s2 withObject:str];
}
-(void)showmsg:(id)msg{
NSArray *array=[msg componentsSeparatedByString:@":"];
NSLog(@"%@ %@ %@",array[0],array[1],array[2]);
}
将字符串转换成SEL:用处:输入通过转换的字符串来调用方法
SEL strss=NSSelectorFromString(@"show");
然后perfomSelector strss 来调用方法
NSString *new=@"show";
[p performSelector:NSSelectorFromString(new)];
分类(oc类的扩展): 在原本的类下添加新的方法,不需要知道原来类的源代码,而且分类用于联合开发更加方便。
分类中不能定义属性,可以被继承,如果写的方法类中原本就有就会导致原本的类中的方法不能使用,分类中的方法优先级更高
@interface 原始类名(分类名)
添加新的方法声明
@end
@implemention 原始类名(分类名)
添加新方法实现
@end
特点: 1、分类不能添加成员变量,可以给已有的类添加新的成员方法
2、分类的分类方法可以被继承
3、一个类可以分开多个人一起开发(联合开发)
4、分类方法与原始类方法同名,分类方法会覆盖原始类方法(NSObject)
5、分类中方法的调用是根据最后哪个执行来调用。
比较常用的数据格式化。
//格式化输出字符
NSString *str=[NSString stringWithFormat:@"[%@]",self];
NSLog(@"%@",str);
//输出后的是[字符串],相当于加上一个[];
功能分类:在.h文件中实现声明分类,在.m文件中的@ implemention实现方法
类的私有方法:在.m文件中声明分类,在@implenemtion实现方法,但是调用只能通过对象方法中用[self 方法名]来调用。
设计一个学生类,(学生会--考勤,检查寝室,发通知,组织活动) 党支部---党会,好人好事,上党课 班干部---开班会,收作业,叫起床,管理班费
用sel来实现指向学生会一切工作,类设计是包含构造方法