id d; //万能指针,指向\操作任何OC对象。
id d = [Person new];
// id 相当于NSObject *;
构造方法:
Person *p = [Person new];
完整的创建一个可用的对象
1.分配存储空间 +alloc
2.初始化 -init
1.调用+alloc分配存储空间
Person *p1 = [Person alloc];
2.调用-init进行初始化
Person *p2 = [Person init];
整合成一句以后为:
Person *p3 = [ [Person alloc] init ];
定义
构造方法:用来初始化对象的方法,是个对象方法, - 开头
重写方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
重写构造方法的注意点
1.先调用父类的构造方法([super init])
2.再进行子类内部成员变量的初始化。
去.h文件中 重写 -init方法
- (id) init
{
//一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性。
self = [super init]; //当前对象 self(以后讲,不要纠结)
if (self != nil) //nil等于空的意思 //也可写成(self = [super init])
{
//初始化成功
_age = 10;
}
//3.返回一个已经初始化完毕的对象。
return self;
}
自定义构造方法的规范
1.一定的hi对象方法,一定以 - 开头
2.返回值一般是id类型
3.方法名一般以initWith开头。
(Categeory)分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法
例如:
@interface Person (MJ)
方法
@end
可以为Person添加方法,但不能增加成员变量。
使用注意:
1.分类只能增加方法,不能增加成员变量。如果想添加变量,可以考虑通过继承创建子类。
2.分类方法实现中可以访问原来类中声明的成员变量。
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用。
4.多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效。
5.方法调用优先级:分类(最后参与编译的分类优先) --> 原来类--> 父类
6.查找方法时,优先去分类方法中查找,然后再去原来类中找,最后再去父类中找
给系统自带的类添加方法
NSString 方法:
NSString *str = @”aa2s22dd1d2d2d2d”;
查看字符串的每一个字符
unichar c = [ str characterAtIndex:0];
查看这个字符串第一个字符是什么
获取内存中的类对象有两种方法
1.Class c = [ p class];
2.Class c2 = [Person class];
类对象指的就是Person类。
内存中的类对象
类对象 = = 类
load
1.当程序启动的时候,就会加载一次项目中所有的类。在类被加载的时候调用+load方法。
2.先加载父类,再加载子类:也就是先调用父类的+load,再调用子类的+load
3.先加载原始类,再加载分类
4.不管程序运行有没有用到这个类,都会调用+load加载
+(void)load
{
NSLog(@”aaa”);
}
+initialize
1.当类第一次使用init这个类的时候,就会调用一次+initialize方法
2.一个类只会调用一次+initialize方法,先调用父类的,再调用子类的。
+(void)initialize
{
}
获取类对象的2种方式
Class c = [Person new ]; // 类方法
或者
Person *p = [Person new ];
Class c2 = [p class]; // 类对象
默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址>
1.会调用对象p的-description方法
2.拿到-description方法的返回值(NSString *)显示到屏幕上
3.-description方法默认返回的是“类名+内存地址”
4.所以,想要改变就要重写-description方法。
5.在Person的实现类里重写-description方法
6.在-description方法中使用NSLog打印self会进入死循环。
例如:
- (NSString *)description
{
Return [NSString stringWithFormat:@”age=%d,name=%@”,_age,_name];
}
_LINE_ 行号(那一行的行数)NSLog(“%d”,_LINE_);
_FILE_ 输出当前路径 用%s 不能有中文 所以只能用printf()
_func_ 输出当前函数名 用%s
SEL
1.每个类的方法列表都存储在类对象中
2.每个方法都有一个与之对应的SEL类型的对象
3.根据一个SEL对象就可以找到方法的地址,近而调用方法
[p test2];
1.把test2包装成SET类型的数据
2.根据SEL数据找到对应的方法地址
3.根据方法地址调用对应的方法
最简方法
[p performSelector:@selector(test3:) withObject:@”456”];
等于
SEL s = @selector(test3);
_cmd代表当前方法。 |
|