类的本质Class
来源:互联网 发布:阿里算法工程师p6待遇 编辑:程序博客网 时间:2024/06/15 20:58
1.类实际上在内存中也会被分配内存空间,不过在内存空间中只会分配一个内存空间给这个类。
2.既然只分配一次内存空间,则类在内存中只会加载一次,在程序运行时就加载。
3.一个类在内存中只有一块内存空间,这个内存空间就是用来存储Classs类的对象
4.实际上内存中存放的类就是Class的对象,只是说Class这个类的对象指向了一个类的内存空间,就像指针对象一样,指向了一个类的对象的内存空间。
5.类中的方法是放在类中的,不是在对象中,而是对象共享这些方法6.一个类的类名即为Class的对象,Class为所有类的对象的类型,对象是有类型的。
7.获取Class对象即类对象通过[类名 class]或者[类的对象 class]
8.类对象就是类,类就是类对象,所以这个类对象可以调用类方法,即类名就是类对象
9.一个类只有一个类对象
如下的类:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
(void) setAge:( int) age;
(int) age;
+ (void) test;
@end
------------------------------------------------------------------------------------------------------------
Person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
(void)setAge:(int)age
{
self->_age = age;
}
(int)age
{
return self->_age;
}
+ (void) test
{
NSLog(@"Person + test");
}
@end
---------------------------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Class class = [Person class];//表示的是 Person类也为类对象
NSLog(@"%@",class);
return 0;
}
上面的Person类在内存中的空间分配分析:
---------------------------------------------------------------------------------------------------------
1.创建类对象
创建类对象即创建Class的对象,每个类都是Class的对象,通过Class cls = [类名 class]
或者Class cls = [类的对象 class]来创建Class的对象
例:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
( void) setAge:( int) age;
( int) age;
+ ( void) test;
@end
------------------------------------------------------------------------------------------------------------
Person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
( void)setAge:( int)age
{
self-> _age = age;
}
( int)age
{
return self-> _age;
}
+ ( void) test
{
NSLog( @"Person + test");
}
@end
---------------------------------------------------------------------------------------------------------
根据上面的类
<1>通过类名创建类对象:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Class cls = [Person class]; //表示的是 Person类也为类对象
NSLog(@"%@",cls);
return 0;
}
在main方法中,创建了一个类对象,这个类对象表示的就是Person类,也就是所谓的Person类名。
输出结果:
从结果中可以看到类对象cls就是Person类,即Person类名,
上面创建Class类对象还有另外一种形式:
<2>通过类的对象创建类对象:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *person = [ Person new];
Class cls = [person class];//通过类的对象创建类对象
NSLog(@"%@",cls);
return 0;
}
---------------------------------------------------------------------------------------------------------
2.通过类对象调用类方法
因为类对象表示的就是一个类,即类名,而在OC中可以通过类名来调用类方法,所以也可以通过类对象来调用类方法。
例:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
( void) setAge:( int) age;
( int) age;
+ ( void) test;
@end
在Person类中声明了+ ( void) test;这个类方法
------------------------------------------------------------------------------------------------------------
Person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
( void)setAge:( int)age
{
self-> _age = age;
}
( int)age
{
return self-> _age;
}
+ ( void) test
{
NSLog( @"Person + test");
}
@end
---------------------------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Class cls = [Person class];
[cls test];//调用类方法 相当于[Person test]
return 0;
}
输出结果:
---------------------------------------------------------------------------------------------------------
3.通过类对象创建类的对象
既然类对象就是类名,那可以调用类方法new来创建一个类的对象,或者通过alloc给类的对象分配空间再调用init创建类的对象。
例:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
( void) setAge:( int) age;
( int) age;
+ ( void) test;
@end
在Person类中声明了+ ( void) test;这个类方法
------------------------------------------------------------------------------------------------------------
Person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
( void)setAge:( int)age
{
self-> _age = age;
}
( int)age
{
return self-> _age;
}
+ ( void) test
{
NSLog( @"Person + test");
}
@end
---------------------------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Class cls = [Person class];//创建类对象
Person *p = [[cls alloc] init]; //通过类对象创建 Person类的对象
p.age = 20;
NSLog(@"年龄: %d",p.age);
return 0;
}
输出结果:
---------------------------------------------------------------------------------------------------------
3.一个类只有一个类对象,但可以有多个实例对象
因为一个类在内存空间中只分配一个空间,而类的实例对象每次new都会重新分配一个内存空间,所以每个类只有一个类对象,但有多个实例对象
例:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
( void) setAge:( int) age;
( int) age;
+ ( void) test;
@end
在Person类中声明了+ ( void) test;这个类方法
------------------------------------------------------------------------------------------------------------
Person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
( void)setAge:( int)age
{
self-> _age = age;
}
( int)age
{
return self-> _age;
}
+ ( void) test
{
NSLog( @"Person + test");
}
@end
---------------------------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Class cls = [Person class];//创建类对象
Class cls1 = [Person class];//创建类对象
Person *p = [[cls alloc] init]; //创建实例对象
Person *p1 = [[cls alloc] init]; //创建实例对象
NSLog(@"cls的地址: %p",cls);
NSLog(@"cls1的地址: %p",cls1);
NSLog(@"p的地址: %p",p);
NSLog(@"p1的地址: %p",p1);
NSLog(@"cls==cls1 is %d",cls == cls1);
NSLog(@"p == p1 is %d",p==p1);
return 0;
}
输出结果:
上面创建了两个类对象和两个实例对象,从结果中可以看出cls和cls1的地址是一样的,而p和p1的地址是不一样的
---------------------------------------------------------------------------------------------------------
0 0
- 类的本质Class
- Class 类的本质 - iOS
- 详解abstract class和interface的本质
- 详解abstract class和interface的本质
- 关于Class类的成员函数与Java反射机制,坦言Synchronize的本质
- 中type 和class的本质区别(转)
- 通过Class,Method来认识泛型的本质
- java反射:通过Method、Class发现泛型的本质
- C++类的本质
- OC类的本质
- OC类的本质
- 深入类的本质
- 类对象的本质
- 类的本质
- 类的本质
- 84,类的本质
- 类的本质
- 类的本质
- 分类之非正式协议
- 黑马程序员——java语言基础部分——学习盲点总结
- 拓扑排序 HDU 1285 确定比赛名次
- boost asio streambuf与Boost 序列化库
- 程序员的量化交易之路(9)--金融系统概念basis
- 类的本质Class
- 解决宿主机不能访问虚拟机Centos中的站点
- ACM第一个学期回顾
- 第十周项目4—— 类族的设计(1)
- May'English Learning
- 设计模式-模板方法模式 策略模式
- 慕课网深入浅出javascript
- 黑马程序员_Java(反射)
- JDBC