您的位置:首页 > 移动开发 > Objective-C

【Objective-C学习笔记】核心语法——类的本质、description方法

2015-04-05 12:15 537 查看
第一部分 类的本质
一、基本使用
1、类本身也是一个对象,是对象就有类型,是Class类型的对象,简称类对象。
2、内存中创建对象的步骤
(1)利用Class创建Person类对象。
(2)利用Person类对象创建Person实例对象。
3、获取类对象
#import <Foundation/Foundation.h>

@interface Person : NSObject
@end

@implementation Person
@end
(1)实例对象调用class,对象调用class方法获取对象的类对象
Person *p = [[Person alloc] init];
Class *c = [p class];
Class *c1 = [p1 class];
(2)类对象调用class,获取Person类对应的类对象
Class *c2 = [Person class];
(3)类对象的地址一致,说明是同一个类对象
NSLog(@"c=%p, c1=%p, c2=%p", c, c1, c2);
// c=0x100002598, c1=0x100002598 , c2=0x100002598
二、类的加载和初始化
1、重写类的加载和初始化
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

@interface Person : NSObject
@property int age;
@end

@implementation Person
// 当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法
+ (void)load
{
NSLog(@"Person--load");
}

// 当第一次使用这个类的时候,就会调用一次+initialize方法
+(void)initialize
{
NSLog(@"Person---initialize");
}
@end

@interface Student : Person
@end

@implementation Student
// 在类被加载的时候调用
+ (void)load
{
NSLog(@"Student--load");
}

+(void)initialize
{
NSLog(@"Student---initialize");
}
@end

@interface Person (ZC)
@end

@implementation Person (ZC)
// 当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法
+ (void)load
{
NSLog(@"Person (ZC)--load");
}

// 当第一次使用这个类的时候,就会调用一次+initialize方法
+(void)initialize
{
NSLog(@"Person (ZC)---initialize");
}
@end

int main()
{
[[Student alloc] init];

return 0;
}



// 结果:
Person--load
Student--load
Person (ZC)--load
Person (ZC)---initialize
Student---initialize
2、总结
(1)当程序启动时,就会加载项目中所有的类和分类,并调用每个类和分类的+load方法。只会调用一次

(2)当第一次使用某个类时,就会调用当前类的+initialize方法

(3)加载顺序:

1> 先加载父类,再加载子类 (先调用父类的+load方法,再调用子类的+load方法)

2> 先初始化父类,再初始化子类 (先调用父类的+initialize方法,再调用子类的+initialize方法)

3> 注意:先加载原来类,再加载分类,最终的结果就是调用分类的+initialize方法覆盖原来类的+iinitialize方法
第二部分 description方法
一、基本知识
1、对象方法 - description
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出,默认输出的是<类名 地址>
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
@property NSString *name;
@end

@implementation Person
@end

int main()
{
Person *p = [[Person alloc] init];
p.age = 20;
p.name = @"jack";

NSLog(@"%@", p);

retrun 0;
}
// 结果是
<Person: 0x100206870>


2、类方法 + description
使用NSLog和%@输出某个类对象时,会调用类对象的+description方法,并拿到返回值进行输出,默认输出的是类名
Class c = [Person class];
NSLog(@"%@", c);
结果是:
Person
二、打印对象的实例变量

输出某个对象,默认的结果不是我们想要的,我们想要输出对象的实例变量,那么我们需要重写-description方法

@implementation Person
// 决定了实例对象的输出结果
-(NSString *)description
{
return [NSString stringWithFormat:@"age=%d, name=%@", _age, _name];
}
@end
//重写以后,main函数中NSLog(@"%@", p);
age=20, name=jack
三、NSLog打印补充

int main()
{
Person *p = [[Person alloc] init];

// 1.指针变量p的地址
NSLog(@"%p", &p);
// 2.对象的地址
NSLog(@"%p", p);
// 3.<类名:对象地址>
NSLog(@"%@", p);
// 4.输出文件路径
NSLog(@"%s", __FILE__);
//NSLog输出C语言字符串的时候,不能有中文
// 5.输出代码行数
NSLog(@"%d", __LINE__);
// 6.输出所在函数的函数名
NSLog(@"%s", __func__);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐