OC语言——构造方法和分类的使用

2023-05-16


一.构造方法

1调用+alloc分配存储空间 

Person *p = [Person alloc]

2初始化   -init 

Person *p1 = [p init];
//可以整合为一句
Person * p2 = [[Person alloc] init];


3如果有一些特殊需要,例如创建出来的对象是一个特定值,可以重写init方法,进行初始化

(id)init
{
    1,调用回super的init方法
    self = [super init];
    // 如果对象初始化成功,才有必要进行接下来的初始化
    if  ( self !=nil )
    { // 初始化成功
        _age = 10;<pre name="code" class="objc">    // 返回一个初始化完毕的对象
    return self;
}

  
精简版的重写init方法

- (id)init
{
    if  ( self = [super init] )
    {     <pre name="code" class="objc">      _age = 10;
    }
  return self;
<span style="font-family: Arial, Helvetica, sans-serif;">}  </span>

  
<span style="font-weight: bold; font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">构造方法</span>
<span style="font-weight: bold; font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">首先会调用父类的构造方法[super init],</span>
再进行子类内部成员变量的初始化。


当父类中有拥有成员变量,子类需要增加成员变量的时候,只需要更改子类的init方法就可以达到

4.自定义构造方法:

- (void)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{<pre name="code" class="objc">    // 父类中的name和age留给父类初始化,这里只初始化自己
    if( self =[super initWithName:name andAge:age] )
{
         _no = no;
}
     return self;
}

  

二.分类 :category

1.分类依赖于类,不改变原来类的模式下,给原来类扩充方法,不修改原来类的代码。

#import "Person.h" // 给person这个类增加方法必须包含person的头文件</span><pre name="code" class="objc">// @interface 类名(分类名称)
@interface Person (SY)

  

注意点:

分类不能增加成员变量,只能增加方法。

调用方法时,优先去分类中找,然后再去父类中找。

分类会重新实现原来类中的方法,覆盖原来方法,导致原来方法无法使用。

分类-》原来类-》父类

练习:给NSString扩充一个类方法,计算某个字符串阿拉伯数字

+ (int)numberCountOfString:(NSString *)str
{<pre name="code" class="objc">    int count = 0<pre name="code" class="objc">    for (int i = 0; i < str.length; i++)
    {
<span style="white-space:pre">	</span><span style="font-family: Arial, Helvetica, sans-serif;">unichar c = [str characterAtIndex:i];</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"></span></span><pre name="code" class="objc"><span style="white-space:pre">	</span>if(c>='0' && c<='9')
<span style="white-space:pre">	</span>{<pre name="code" class="objc"><span style="white-space:pre">	</span>    count++;<span style="font-family: Arial, Helvetica, sans-serif;">	</span>

  
<span style="white-space:pre">	</span>}

  
    }<pre name="code" class="objc">    return count;
}

  

  

  
给NSString扩充一个对象方法,计算某个字符串阿拉伯数字

-(int)numberCount<pre name="code" class="objc">{<pre name="code" class="objc">    int count = 0;<pre name="code" class="objc">    for (int i = 0; i < self.length; i++)
    {<pre name="code" class="objc"><span style="white-space:pre">	</span>unichar c = [self characterAtIndex:i];<pre name="code" class="objc">        // 如果自负是阿拉伯数字,就让count+1;<pre name="code" class="objc">        if(c>='0' && c<='9')
<span style="white-space:pre">	</span>{
<span style="font-family: Arial, Helvetica, sans-serif;">		</span>    <span style="font-family: Arial, Helvetica, sans-serif;">count++;</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">		</span>}</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">	</span>}</span><pre name="code" class="objc"><span style="white-space:pre">	</span>return count;
}

  

  

  

  

  

  

  

调用方法:

int count = [@"sjja123kadjkh213" numberCount]; // 计算数字个数

类的本质也是对象,是一个class类型的对象,简称类对象 

获取内存中了类对象

class c = [p class];

另一种获取内存中的类对象

class c1 = [Person class];

2.类的load方法

在类被加载的时候调用+load方法,不管你使用不使用,它都会加载。分类中也会加载这个方法

@implementation Person
+(void)load
{
    NSLog(@"Person方法");
}
<pre name="code" class="objc">@end

  
3.类的initialize方法

当第一次使用这个类的时候,就会调用一次当前类的+initialize方法

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

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


4.description方法

默认情况下,利用NSLog和%@输出对象时,结果是<类名:内存地址>;但是我们不需要关心这个。

这种情况下,首先会调用P的-description方法的返回值(NSString *)显示到屏幕上。


所以要重写description方法

<pre name="code" class="objc">// 决定了类对象输出结果 
- (NSString *)description{ return [NSString stringWithFormat:@"age=%d, name = %@", _age, _name];}

  
三.NSLog的输出补充

Person *p =[ [Person alloc] init];

// 指针变量的地址
NSLog(@"%p", &p);
// 对象地址
NSLog(@"%p", p);
// 类名+对象地址
NSLog(@"%@", p);

__LINE__  //  当前代码的行号。用%d输出

__FILE__ //  输出文件路径,用%s输出,使用printf("%s\n",__FILE__);

__func__ // 输出当前函数名,用%s输出,使用NSLog(@"%s\n",__func__);

四.SEL数据类型

一个sel类型就代表一个方法

// 先设置一个SEL类型的数据s保存(test1:)<pre name="code" class="objc">SEL s = @selector(test1:);
// 再调用test1方法,传入@“sun”
[p performSelector:s withObject:@"sun"];

  

每个方法内部都有一个_cmd,它代表当前方法。只能转成字符串调用

- (void)test2
{   // 把cmd转成字符串,输出结果为test2
    NSString *str = NSStringFromSelector(_cmd);
    NSLog(@"调用了test1方法-%@",str);
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OC语言——构造方法和分类的使用 的相关文章

  • mysql02

    查看版本 xff1a select version 查看所有数据库 xff1a show databases xff1b 创建数据数据库 xff1a create database test01 charset 61 utf8 使用数据库
  • 类linux驱动模块框架module_init(init_fun)在STM32上的实现

    原文 xff1a https zhuanlan zhihu com p 81309285 设计思想 利用编译器的特性 xff0c 在程序编译时将各模块初始化函数顺序存放到内存的指定地址 xff0c 然后在程序运行时main函数从这块内存区域
  • 国内如何快速下载keil的pack文件包(干货)

    想要在国内如何快速下载keil的pack文件包 xff0c 真的是有点麻烦的 xff0c 不过网上找了一个好方法 xff0c 可以记录下 在keil的pack 官网 MDK5 Software Packs keil com 查找自己想要的p
  • 使用KEIL C51实现的简单合作式多任务操作系统内核(单片机实现版本)

    基于网上网友的代码 xff0c 自己在单片机上实现 xff0c 特此记录分享之 基于https blog csdn net yyx112358 article details 78877523 使用KEIL C51实现的简单合作式多任务操作
  • [技术分享] 用Python玩转3D人体姿态估计

    转载自3D视觉开发者社区用户 mudi 原文链接 xff1a 技术分享 用Python玩转3D人体姿态估计 如果觉得文章内容不错 xff0c 别忘了三连支持下哦 x1f618 导语 姿态估计 xff0c 一直是近几年的研究热点 它就是根据画
  • 获取相机内参和外参的方法

    作者 童虎 编辑 3D视觉开发者社区 如果觉得文章内容不错 xff0c 别忘了三连支持下哦 x1f618 相机内参 xff1a 是与相机自身特性相关的参数 xff0c 比如相机的焦距 像素大小 相机外参 xff1a 在世界坐标系中的参数 x
  • 计算机专业英语词汇1695词(35天记忆)

    计算机专业英语词汇1695词 xff08 35天记忆 xff09 声明 xff1a 英语其实就是一个工具 xff0c 你会发现很多资料文献或者一些软件基本都涉及到英文 xff0c 尤其从事计算机的体验极深哈 这篇博客总共提供1695个专业词
  • PID调试软件(C#、模拟、仿真)

    突然想起要玩下PID xff0c 于是又想到强大的C xff0c 好吧 xff0c 搞个小软件玩下 首先花点时间学习PID xff0c 用的都是网上资料 xff0c 开始是先看http www amobbs com thread 50433
  • [docker报错] 用docker build构建python项目镜像时,执行到RUN pip install报错

    问题描述 用docker build构建python项目镜像 xff0c 执行到RUN pip install后 xff0c 长时间没有响应后报错 xff0c 原本以为是网速太慢导致下载失败 后来看到这篇 xff08 docker buil
  • 软件测试面试中项目介绍宝典

    面对 面试造飞机 xff0c 工作拧螺丝 的杯具 xff0c 我们必须做好准备工作 xff1a 打有准备的仗 测试的面试相对于开发的面试来说 xff0c 对于技术的询问其实相对来说较少的 xff0c 技术这一块主要针对以下几个方面 测试理论
  • 详解超声波测距模块HC-SR04的使用

    1 模块简介 HC SR04超声波模块常用于机器人避障 物体测距 液位检测 公共安防 停车场检测等场所 HC SR04超声波模块主要是由两个通用的压电陶瓷超声传感器 xff0c 并加外围信号处理电路构成的 如图 xff1a 两个压电陶瓷超声
  • Docker安装图形界面Shipyard

    Shipyard xff08 github xff09 是建立在docker集群管理工具Citadel之上的可以管理容器 主机等资源的web图形化工具 包括core和extension两个版本 xff0c core即shipyard主要是把
  • # 转载chmod+X与chmod777

    chmod 43 X与chmod777 原文 xff1a https blog csdn net qq 42982742 article details 103690119 chmod 43 x 是将文件状态改为可执行 xff0c 而chm
  • C++几个适合的OJ刷题网站

    RQNOJ VIJOS 这两个还比较基本 xff0c 题目也是中文的 对于准备NOI或者省选的话 xff0c BZOJ是不错的 ACM什么的 xff0c 最好就做POJ xff0c SGU xff0c Codeforces等题库 xff0c
  • Android系统深度游

    项目原因 xff0c 让我们必须深入探索Android系统 xff0c 完成对之前的我们来说比较艰巨的任务 这样 xff0c 我们开启了Android深度游 Android这个系统 xff0c 应用层开发还是比较舒服的 xff0c Goog
  • IT痴汉的工作现状56-耳鸣

    自从这个项目启动 xff0c 与客户方的沟通就逐渐多了起来 xff0c 沟通的方式是语音会议 也不知从什么时候起 xff0c 每天的会议时间变得很长很长 尤其是定位复杂问题时 xff0c 一个会议就要4个小时 张伟是从项目开始买的耳机 xf
  • 我的2020---熬过去

    恰逢周末 xff0c 本人自认为过了一个美好的圣诞节之后 xff0c 在深圳图书馆开始思考我的第十一个年终总结了 提笔之前 xff0c 我翻看了去年的总结 xff0c 想到了我还有一套书没有读完 xff0c 那就是 大败局 2020结束还有
  • 我的2022-工程师文化的思考

    没有想到 xff0c 今年大环境的变化可谓是大开大合 xff0c 超出想象 各行各业都遭到强大的挑战 xff0c 是泯灭还是苟活 xff0c 亦或是再创辉煌 xff0c 时也命也 在此情况下的个人 xff0c 最好的选择是跟公司抱团取暖 x

随机推荐

  • 我的2013---全速前行

    一晃 xff0c 自己也步入了而立之年 在IT这个行业 xff0c 而立 xff0c 意味着很多事情 现实的骨感不得不让自己想得更多 xff0c 但是到头来发现自己能做的仍只有继续好好工作 其实年龄是IT行业永恒的话题 xff0c 但我还是
  • 用户名 不在 sudoers文件中,此事将被报告。

    继续昨天的故事 话说昨天新建了一个帐号linc xff0c 今天在执行sudo时回显一个很吓人的信息 xff1a sudo password for linc linc 不在 sudoers 文件中 此事将被报告 这是要去哪儿报告呢 xff
  • Git冲突:commit your changes or stash them before you can merge.

    今天用git pull来更新代码 xff0c 遇到了下面的问题 xff1a error Your local changes to the following files would be overwritten by merge xxx
  • Android问题集锦之二十八:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    错误描述为 xff1a java lang IllegalStateException You need to use a Theme AppCompat theme or descendant with this activity 起因
  • Docker实践6:Cannot connect to the Docker daemon.

    正在免费适用着Aliyun主机 xff0c 当然要用docker来部署我的服务器啦 但是今天碰到了题目的问题 xff0c 细节如下 xff1a span class hljs comment docker info span FATA sp
  • 一个简单的自定义通信协议(socket)

    转自 xff1a http vtrtbb javaeye com blog 849336 这是转自javaeye的一篇文章 xff0c 作者是vtrtbb 按照网络通信的传统 xff0c 我们都会自定义协议 xff0c 这有很多好处 xff
  • ImageView 设置图片

    android doc中是这样描述的 xff1a public void setImageResource int resId 这是其中的一个方法 xff0c 参数resld是这样 xff1a ImageView setImageResou
  • Android问题集锦之八:调用其他程序中的activity和Permission Denial: starting Intent 错误解决办法

    今天想调试多个task中栈的情况 xff0c 在测试程序中调用另一个程序的activity xff0c 代码片段如下 xff1a btnStartX 61 Button findViewById R id btnStartX btnStar
  • VB.NET串口通信例子--我的回忆录

    这是我3年前的一个例子 xff0c 最近翻出来回忆一下 串口是计算机上一种非常通用设备通信的协议 大多数计算机包含两个基于RS232的串口 xff0c 现在配电脑好像只有一个 串口同时也是仪器仪表设备通用的通信协议 xff1b 很多GPIB
  • TiDB-部署(tiup方式)

    一 环境 ip xff08 非真实 xff09 功能配置192 168 1 1中控机 xff08 监控等位置所在 xff09 最低192 168 1 2TIDB PD TIFLUSH 如果机器多可以分开 高192 168 1 3TIKV 1
  • 信号量

    信号量的数据类型为结构sem t xff0c 它本质上是一个长整型的数 函数sem init xff08 xff09 用来初始化一个信号量 它的原型为 xff1a extern int sem init P sem t sem int ps
  • 【51为例】单片机编程技巧(一)——写自己的库

    前言 为什么要写自己库呢 xff1f 因为随着项目的越来越复杂 xff0c 如果代码都堆再一个main c文件里的话管理起来会比较难 你出现想找到某部分的代码得上下翻找 因此把各部的代码建立一个独立的库会使代码管理起来相对容易 想找到某部分
  • 遨博协作机器人ROS开发 - Gazebo仿真与控制真实机器人

    目录 一 简介 二 环境版本 三 Gazebo仿真 1 gazebo使用 2 仿真遨博机械臂 四 ROS控制真实机器人 1 网络配置 2 真实机器人控制 3 真实机器人运动速度调节 五 小结 一 简介 大家好 xff0c 欢迎关注遨博学院带
  • 我的2014

    时间匆匆如流水 xff0c 生活总是不停的翻写新的篇章 我的2014同样缺少不了 毕业两年了 xff0c 工作也比较轻松 xff0c 无趣 同事们的话 xff1a 坐等OVER 在清闲的工作中 xff0c 失去了往日的 冲动 感觉自己也一点
  • C语言基础----流程控制

    流程控制是C语言中比较基础的 它分为三种状态 xff1a 1是顺序结构 2是选择结构 3是循环结构 我要说明后两种结构 xff0c 选择机构和循环结构 首先先说 xff1a 选择结构 选择结构是指 xff1a 当一个条件成立则执 xff08
  • 复杂数据类型——数组

    复杂数据类型是C语言基础的重点 1 数组 xff1a 存储一组数据 2 特点 xff1a 只能存放一种类型的数据 如int类型 xff0c float类型的数据 数组的元素个数只可以放常量 int ages 5 61 1 2 3 格式 xf
  • OC语言——基本语法和思想

    今天学习了OC语言基础语法 1 oc语言完全兼容C语言 xff0c 后缀为 m类型 被广泛应运与开发苹果mac os x平台和ios开发平台 2 oc语言关键字基本上以 64 开头 xff0c oc字符串也是以 64 开头 3 基本类型新加
  • OC语言——三大特性-继承与多态

    继承是oc中比较常见的 1 继承 xff1a 就是当两个类拥有相同的属性和方法时 xff0c 就可以将相同的东西抽取到一个父类中 子类可以拥有父类中所有的成员变量和方法 2 继承的好处 xff1a 可以抽取重复代码 xff0c 节省时间 建
  • OC语言——点语法和成员变量的4种作用域及property和synthesize的使用

    点语法 xff1a 点语法的本质还是方法调用 Person p 61 Person new 点语法的本质还是方法调用 p age 61 10 p setAge 10 一 点语法注意点 xff1a 64 implementation Pers
  • OC语言——构造方法和分类的使用

    一 构造方法 1调用 43 alloc分配存储空间 Person p 61 Person alloc 2初始化 init Person p1 61 p init 可以整合为一句 Person p2 61 Person alloc init