类的本质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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 单位申报个税身份证号码填错怎么办 申报个税身份证号码填错了怎么办 办了人事代理联系函商调函怎么办 劳务公司与分包工头算账成怎么办 客户退保业务员己得保险佣金怎么办 投了简历公司打来电话没接到怎么办 跟老板要工资她说过几天怎么办 公路车弯把手小抓不到刹车怎么办 新手骑电动车上路车子一直晃怎么办 不知情收赃东西已经卖了怎么办 档案和派遣证不在同一个地方怎么办 档案缺招工表和派遣证怎么办退休 开发商对接的银行利息比较高怎么办 工作未满一年离职转正定级怎么办 被网络骗贷翻到几十万怎么办 面试通过后迟迟不通知入职怎么办 厂里捡到饭卡花了里面的钱怎么办 上班用自己手机打卡没电怎么办 逸尚考勤机显示超出考勤记录怎么办 下雨穿套裙工装上班好冷怎么办 蚂蚁借呗放款中不到账怎么办 护士电子化注册没有激活码怎么办? 地铁站务员入职体检身高差点怎么办 车子钥匙锁在车里了怎么办 打错账户了怎么办5天了 下岗失业人员在就业后档案怎么办 皮秒祛斑后没有敷面膜怎么办 硕士毕业工资好低不想工作怎么办 车卖了etc忘拿了怎么办 成熟卵泡打破卵针也不破怎么办? 深圳孩子户口挂别人名下上学怎么办 襄阳东风合运花园房贷怎么办下来 猫在外面躲起来找不到了怎么办 本科三批取消以后三本学校怎么办 机票名字多了个字母安检怎么办 出隧道口限速40超速了怎么办 社保交了五年后断交以后该怎么办 躺椅折叠椅坐的地方坏了怎么办 苹果手机锁频密码忘了怎么办 客户要货公司不给进怎么办 高铁23:00买的票怎么办