OC中description、 SEL、类本质、self和super用法

一:description方法

description有对象方法和类方法两种,(是NSObject类的方法)

1,-description(对象方法)

使用NSLog和@%输出某个对象时,会调用对象的description方法,并拿到返回值进行输出。(系统会自动调用打印对象的description方法)

而如果打印NSString对象的话,默认返回的就是NSString字符串

2,+description (类方法)

使用NSLog和@%输出某个类时,会调用类的description类方法,并拿到返回值进行输出。

系统默认会直接调用NSObject父类的description方法,返回对象的名和地址打印出来

所以如果我们想要打印属性值的话就需要重写description的方法

#import <Foundation/Foundation.h>

@interface Car : NSObject

{

@public

    int _lunzi;

    int _seats;

    NSString *_name;

}

-(void)run;

@end

@implementation Car

-(void)run{

    

    NSLog(@"三胖驾车跑了");

    

}

//重写父类的description方法

-(NSString *)description{

    

    return [NSString stringWithFormat:@"name:%@,lunzi:%d,seats:%d",_name,_lunzi,_seats];

    

    //self car

    //return [NSString stringWithFormat:@"aaaa-%@",self];

}

 

+(NSString *)description{

    

    return @"xxxx";

    

}

@end

 

int main(int argc, const char * argv[])

{

        Car *car = [Car new];

        car->_name = @"大切";

        car->_lunzi= 8;

        car->_seats= 10;

        

        //%@ 可以打印OC中的对象类型

        //NSString *str = @"xxxx";

        //注意:当我们使用%@ 打印car(对象)的时候,会调用我们类的

        //                       -(NSString *)descrition;

        //

        Class c = [car class];

        NSLog(@"\ncar:%@",car);

        NSLog(@"\nCar:%@",c);

        NSLog(@"name:%@,lunzi:%d,seats:%d",car->_name,car->_lunzi,car->_seats);

        return 0;

}

 

 

 

二:类的本质

   类本身也是一个对象,是class类型的对象,简称“类对象”。

Class类型的定义: Typedef struct obj class *class;

可以看到类对象的类型为struct 0bj class *  及指向结构体地址的指针类型
获取内存中的类对象有两种方法:(一个类的类对象只有一个及内存分配一个相同的空间

(1)Class c=[p class];  //指向类的对象的指针调用class方法

(2)Class c1=[Person class]; //使用类名调用class方法

 

类对象本质图解:

类———————类对象-------------实例对象
在编译时就会将类加载到代码区
然后加载类对象到堆区
后三步为对象的加载,并且实例对象的isa指针指向类对象。类对象中isa指针指向类。(而且类对象中得SEL映射表为类中方法地址
三:SEL:全称Selector 表示方法的存储位置。sel是一种数据类型,存放方法的地址,在类对象的映射表里面存放着映射关系
Person *p=[[Person alloc] init];

        [p test];

实例对象寻找方法的过程

1>首先将方法包装成sel数据类型的数据  SEL *sel = @selector(方法名)

2>然后根据SEL找方法的地址

3>根据方法的地址调用相应的方法

4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

关于_cmd:每个方法的内部都有一个-cmd,代表着当前方法。

//SEL是一种数据类型,获取方法的地址

SEL s1 = @selector(run);   //取出run的地址

 [p2 performSelector:s1];   //间接的调用run

注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

四:self和super的用法: 

self、super是一个指针,self谁调用了当前方法,self就指向谁

而super指向了当前类的父类,如果super在类方法中,它就代表了调用当前类方法的类的父类,如果在对象方法中,它就代表调用当前对象方法的对象的父类对象

1>如果self、super在类方法中,那么它就代表当前调用这个类方法的类、父类
2>如果self在对象方法中,那么它就代表当前调用这个对象方法的对象、父对象

出现在对象方法中,就代表着当前对象,出现在类方法中,就代表着当前类】

Self、super的用途:通下

(1)可以利用self->成员变量名访问当前对象内部的成员变量(仅在对象方法中)

(2)[self 方法名];可以调用其他的对象方法或者是类方法

转载于:https://www.cnblogs.com/-boy/p/4069955.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改场景默认pawn的方法

playstart方法 1. 放置playstart到场景中 2. 修改world settings的GameMode 直接放置pawn方法 1. 放置pawn到场景中 2. 修改world settings的GameMode 3. 修改pawn的Auto Possess Player为Player 0

lecture3-线性神经元和算法

Hinton第三课 这节课主要是介绍NN的输出端常用的神经元&#xff0c;然后重点是说明怎么使用BP来计算偏导数&#xff0c;在Hinton这一课中&#xff0c;他提供了他1986年参与写的《并行分布处理》一书的第8章&#xff0c;49页&#xff0c;这本书的编者是当你的认知神经界的Rumelh…

ubuntu开机出现错误“Error found when loading /root/.profile”解决

在刚修改完root权限自动登录后&#xff0c;发现开机出现以下提示&#xff1a; Error found when loading /root/.profile stdin:is not a tty 解决方法&#xff1a;在终端中用命令gedit /root/.profile&#xff0c;打开文件后找到“mesg n”&#xff0c; 将其更改为“tty -s …

DropBox 超实用的免费文件网络同步、备份、分享工具

http://www.iplaysoft.com/dropbox.html DropBox 就是一款非常好用的免费网络文件同步工具(当然它也算是一个服务)。当你在电脑A使用DropBox时&#xff0c;指定文件夹里所有文件的改动均会自动地“同步”到DropBox的服务器&#xff0c;当下次你在电脑B需要使用这些文件时&#…

8个有趣的Linux提示与技巧

我们时不时给你带来关于Linux的提示与技巧。这里我们总结了8个最有趣的提示和技巧。推荐学习Linux视频教程。 以它们的大小列出文件如果你想要一个基于它们大小排序的文件列表&#xff0c;你可以使用下面的命令。它会以递减顺序排列文件。# ls -l | grep ^- | sort -nr -k 5 | …

Ubuntu 14.04 文件服务器--samba的安装和配置

samba是Linux系统上的一种文件共享协议&#xff0c;可以实现Windows系统访问Linux系统上的共享资源&#xff0c;现在介绍一下如何在Ubuntu 14.04上安装和配置samba一、 一、更新源列表 打开"终端窗口"&#xff0c;输入"sudo apt-get update"-->回车--…

export LD_LIBRARY_PATH 的使用

对linux不是很熟&#xff0c;之前只是听说过可以设置程序共享库位置也就是 使用 “export LD_LIBRARY_PATH” 今天用了用&#xff0c;感觉还挺不错&#xff0c;也很常用。 比如你编译了一个so 而这个so 同时又依赖其他第三方库。如果你想把你编译的so 提供给别人用的话&#…

MongoDB命令及SQL语法对比

mongodb与mysql命令对比 传统的关系数据库一般由数据库&#xff08;database&#xff09;、表&#xff08;table&#xff09;、记录&#xff08;record&#xff09;三个层次概念组成&#xff0c;MongoDB是由数据库&#xff08;database&#xff09;、集合&#xff08;collectio…

[oracle] 组织架构退格显示 connect by

1. 按组织架构关系退格显示 create or replace view v_vieworg asselect --v.OBJID,v.OBJNAMElevel as levelid, lpad(        ,2*level-2)||v.OBJNAME as OBJNAME,v.OBJID,v.OBJCODE,v.ISDEPT,v.PARENTAREAID,v.PARENTDEPTID,v.ParentID,v.canceledfrom v_organddept …

创建mip纹理链

(1) 我们要做的是&#xff0c;根据原始纹理T0创建一系列的纹理&#xff08;通常使用平均滤波&#xff09;&#xff1a;T1、T2…Tn&#xff0c;其中每个纹理的大小都是前一个纹理的1/4&#xff0c;即长度和宽度减半&#xff0c;如图12.40所示。 要根据前一个mip纹理计算当前纹…

Oracle RAC学习笔记:基本概念及入门

oracle 10g real application clusters introduction 1、什么是cluster一个cluster是由两个或是多个独立的、通过网络连接的servers组成的。几个硬件供应商多年以来提供了Cluster性能的各种需求。一些Clusters仅仅为了提供高可用性的&#xff0c;在当前活动的node发生故障时…

微信公众平台新增语义理解接口

微信公众平台语义理解接口正式对外开放。通过语义接口&#xff0c;接收用户发送的自然语言请求&#xff0c;让系统理解用户的说话内容。 微信语义理解接口提供从用户自然语言输入到结构化解析的技术实现&#xff0c;使用先进的自然语言处理技术给开发者提供一站式的语义解析方案…

Jetty 的工作原理以及与 Tomcat 的比较

http://www.ibm.com/developerworks/cn/java/j-lo-jetty/Jetty 目前的是一个比较被看好的 Servlet 引擎&#xff0c;它的架构比较简单&#xff0c;也是一个可扩展性和非常灵活的应用服务器&#xff0c;它有一个基本数据模型&#xff0c;这个数据模型就是 Handler&#xff0c;所…

最大子图形问题

CODEVS1159最大全0子矩阵 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵&#xff0c;所谓最大是指O的个数最多。思路&#xff1a;这个题最朴素的n^6的算法&#xff0c;超时美美的。。。然后想优化&#xff0c;从一个点向上方、左方、右方扩展&#xff0c;首先更…

仿真程序驱动视景问题

1. 坐标对应&#xff0c;东北天还是东南天 2. 跑道角度 3. 单位&#xff0c;厘米&#xff0c;米

Android--Facebook Login without LoginButton

1.引入facebook 工程lib&#xff0c;在Manifest中声明com.facebook.LoginActivity&#xff0c;facebook_app_id <activityandroid:name"com.facebook.LoginActivity"android:label"string/app_name"android:theme"android:style/Theme.Translucent…

【Direct3D游戏开发】——DirectInput 让世界动起来

其实我们是可以通过Windows消息和API取得键盘或者鼠标或者其他设备的输入信息&#xff0c;但这有个等待windows消息传送的延时&#xff0c;笔者试过直接在消息回调函数中相应键盘的上下左右消息去使场景中的模型进行旋转&#xff0c;感觉有明显的延时。这对于游戏玩家来说简直是…

UE4多线程

UE4中最基础的模型就是FRunnable和FRunnableThread&#xff0c;FRunnable抽象出一个可以执行在线程上的对象&#xff0c;而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRunnable UE4为我们抽象FRunnable的概念&#xff0c;让我们指定…

使用.net备份和还原数据库

使用.net备份和还原数据库 原文:使用.net备份和还原数据库CSDN网友的提问http://community.csdn.net/Expert/TopicView3.asp?id4929678C#实现SQLSERVER2000数据库备份还原的两种方法: 方法一&#xff08;不使用SQLDMO&#xff09;&#xff1a;//////备份方法///SqlConnection …