ios笔记--class关键字,Category,protocol和block笔记

2023-11-03


1、@class关键字介绍

(1)概念:只是声明是一个类,但是调用不了这个类里面的方法。

(2)作用:只是定义成员变量、属性。

(3)好处:当import导入的文件里面的方法变动了,引用的地方也要跟着改变,而且还需要重新编译一次,影响程序效率。但是使用@class关键字声明的类就不用跟着改变,效率比较高。

 

2@classimport的区别

(1)import方式会导入被引用类的所有信息,包括被引用类的变量和方法,而且运行时也会对其编译,影响效率;@class方式只是告诉编译器,@class修饰的只是类的声明,具体这个类里面有什么信息,不需要知道,等实现文件中真正要用到时,才会真正去查看这个类中的信息。

(2)使用@class方式只需要知道被引用类的名称就可以了。

(3)import方式如果引入的文件中稍有改动,都要重新编译一次,这样造成效率低,使用@class就不会出现这样的问题。

 

3、Category(分类)

(1)概念:对类进行扩展,只能扩展方法,不能扩展成员变量,不需要创建子类,也不需要知道其源代码分类实现了类方法模块化,把不同方法分配到不同的分类文件中

(2)作用:可以为已存在的类添加新的方法,跟继承不一样,可以实现把不同的方法分割到不同的类中去编写,最终加载合并到一起运行。

(3)好处:当你在定义类的时候,突然发生需求变化,但是又不想改变原来的东西,那么可以使用分类进行扩展;使用分类可以进行分工合作,提高代码编写效率。

4)例子:(在不改变Student类文件的基础上新添一个test2方法)

Student.h文件中:

#import<Foundation/Foundation.h>

@interface Student NSObject  

-(void) test

@end

 

Student.m文件中:

#import “Student.h”

@implementation Student 

-(void) test{

NSLog(@”test方法”);

}

@end


//创建一个分类,新添test2方法。

Student+Test.h分类声明文件中

#import “Student.h”

@interface Student (Test)  //()代表是一个分类,括号中的名称代表分类名称

-(void) test2

@end

 

Student+Test.m分类实现文件中

#import “Student+Test.h”

@implementation Student (Test)

-(void) test2{

NSLog(@”扩展了一个test2方法”);

}

@end

 

4Protocol :协议介绍

(1)概念:就是一系列方法的列表,其中声明的方法可以被任何类实现。

(2)用法:里面的方法可以只用部分,这点跟java的接口不一样,里面方法可以不全部实现。一个协议可以遵守多个协议,多个协议之间用逗号隔开,相当于拥有了其他协议中的方法声明,只要父类遵守了某个协议,就相当于子类也遵守了。

(3)基协议:NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它。因为NSObject协议中声明很多OC框架中的基本方法 比如descriptionretainrelease

4)例子:(监听按钮事件)

Button.h文件:

#import<Foundation/Foundation.h>

//<>代表实现某个协议

@protocol  ButtonDelegate<NSObject> //定义了一个叫ButtonDelegate的协议

-(void) onClick;

@end

@interface Button : NSObject

@property  (noatomic, retain) id<ButtonDelegate> delegate;//声明一个监听器,id后面<>表示实现这个协议

-(void) click; //代表点击了按钮

@end

 

Button.m文件:

import “Button.h”

@implementation Button

-(void) delloc{

[_delegate release];//回收监听器内存

[super dealloc];

}

-(void) click{

[_delegate onClick]; //调用监听器的点击事件,告诉监听器按钮被点击了。

}

@end

 

ButtonListener.h文件:

#import<Foundation/Foundation.h>

#import “Button.h”

@interface ButtonListener:NSObject<ButtonDelegate>

@end

 

ButtonListener.m文件:

#import “ButtonListener.h”

@implementation ButtonListener

-(void) onClick{ 

NSLog(@”按钮被点击了。”);

}

 

5、block(代码块)

1)概念:用来封装一段代码,可以在任何时候执行。标志是^

2)用法:可以作为函数参数或者函数的返回值,block有形参,有返回值,和传统的函数指针很类似,只是block是内联函数,默认情况下它对局部变量是只读的,即不能在block里面修改成员变量,要想修改成员变量,需要在外部的变量加有两个下划线的block,__block。如:

#import <Foundation/Foundation.h>

 

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

{

__block int a = 20;//注意block前面是两个下划线

void (^myblock)() = ^{

NSLog(@"a = %d",a);

a =10; //外部变量有__block声明,所以在block里面可以修改block的值

NSLog(@"a = %d",a);

};

myblock(a);

return 0;

}

3)定义block变量的写法:

 int (^sumBlock)(int,int);

 void (^myBlock)();

4block实现封装代码的3种写法:

第一种:

^(int a,int b){

    return a + b;

 };

 第二种:

 ^(){

    NSLog(@"a+b");

 };

 第三种:

 ^{

    NSLog(@"a+b");

 };

5block完整应用举例:

#import<Foundation/Foundation.h>

//利用typedef定义block类型

typedef int (^MyBlock)(int,int);

// 这样就可以利用MyBlock这种类型来定义block变量

//写法一:利用宏定义去写一个block

void test(){ 

MyBlock block;

block=^(int a, int b){

     return a - b;

  };

NSLog(@”%i”,block(10,10));//调用block

}

 //写法2:跟写法一一样,利用宏定义去定义一个block

void test2(){ 

MyBlock b3 = ^(int a,int b){

return a - b;

}

NSLog(@”%i”,b3(10,10));//调用block

 };

//或者写法3:不用宏定义,直接用block的写法,原始用法

void test3(){

//定义了一个block,这个block返回值是int类型,接收两个int类型的参数

int  (^sum) (int,int) = ^(int a,int b){

return a+b;//return返回的是block的返回值

}

NSLog(@”%i”,sum(10,10));//调用block

}

void main()

{

test();

test1();

test2();

}

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

ios笔记--class关键字,Category,protocol和block笔记 的相关文章

  • 从字典返回类属性的数组

    Background 最近试图回答一个question https stackoverflow com q 58835358 9758194 我自己在想是否可以直接从字典项返回类对象属性的数组 Code Imagine TstClass作为
  • Python 中的类位于不同的文件中吗?

    与 Java 或 php 非常相似 我习惯将类与文件分开 Python 中也是同样的情况吗 另外 我应该如何命名该文件 像classname py一样小写还是像ClassName py一样 如果我想从此类创建一个对象 我是否需要做一些特殊的
  • 如何从 __subclasses__ 中删除类?

    当从类继承时 子类可以通过父类访问 subclasses method class BaseClass pass class SubClass BaseClass pass BaseClass subclasses
  • 将字符串作为有序字典导入

    我有一个没有扩展名的文件 其中包含这样的行 忽略行之间的间距 但每一行都是单独的行 OrderedDict key1 u value1 key2 value2 OrderedDict key1 u value1 key2 value2 Or
  • 导入后属性未添加到模块中

    我做了以下实验室 vagrant ubuntu xenial test tree pack1 init py mod1 py pack2 init py mod2 py mod3 py test py 2 directories 6 fil
  • Python 检查 __init__ 参数

    在过去的几个小时里我一直在试图解决这个问题 但我即将放弃 如何确保在 python 中只有匹配的特定条件才会创建对象 例如 假设我想创建一个对象 Hand 并且仅当初始化程序中有足够的 Fingers 时才初始化 Hand 请以此作为类比
  • 如何将类成员函数的返回类型设置为私有结构的对象

    很抱歉这个又长又令人困惑的标题 但我想不出更好的方法来问这个问题 所以 我有一堂课 template
  • 如何在 Windows 上使用 Pyreverse

    我想使用pyreverse 创建图表类 我下载它 当我使用这个命令时 pyreverse bat c PyreverseCommand a1 s1 f ALL o png test py 我收到错误 名称 点 无法识别 什么是 点 如何创建
  • C++ 中类定义的顺序

    我这里有点问题 我试图定义几个类 其中一些是玩家 一些是属于玩家的 Pawn 来自 Python 我习惯于能够通过 Pawn 方便地访问 Pawn 拥有的 Player 以及通过 Player 访问 Player 的 Pawn 如果我错了请
  • 如何导入名称与我的包中的模块冲突的模块?

    我的目录中有几个 python 模块 在同一目录下 我有一个包tests 我很想将模块命名为tests与它们包含测试的模块相同 尽管这当然并不重要 So in tests foo我天真地写着import foo 这不太好用 它是导入的tes
  • 列出类的所有实例

    我编写了一个 Python 模块 其中有几个类继承自一个名为MasterBlock 我想在脚本中导入此模块 创建这些类的多个实例 然后获取该类的所有子级的所有现有实例的列表MasterBlock班级 我找到了一些解决方案vars Block
  • java中有没有更好的方法来获取当前类变量?

    现在我正在做这样的事情 private static Logger logger LoggerFactory getLogger MasterController class 有没有比使用类名称 MasterController 更好的方法
  • 如何动态构造方法?

    我设计了一个类 它非常标准 具有一些方法属性 class foo def f1 self print f1 def f2 self print f2 def fn self print fn 现在我想创建一个包含一组 foo 实例的类 cl
  • 如何根据 URL 路径添加 CSS 类?

    如何根据我所在的路径将 CSS 类添加到 div 中 包括如果我在其中包含 则不应该出现问题 div class popup ul li a href vs Example 1 a li li a href bod Example 2 a
  • 在其抽象超类中使用子类的泛型类型?

    在我的代码中有以下抽象超类 public abstract class AbstractClass
  • Sinatra 请求对象

    我可能在这里遗漏了一些非常明显的东西 但我似乎无法找到答案 或者自己解决它 在西纳特拉 他们有一个self get方法 捕获块 当调用块时 您可以使用request里面有变量 这怎么可能 Sinatra module Sinatra cla
  • 从 Selenium Webdriver WebElement 字段检索值并将其传递给 java 变量

    首先 请原谅初学者的问题 我是 Java 和 Selenium Webdriver 的新手 我正在通过尝试测试 CMS 应用程序来学习 Webdriver CMS 的概念是创建文章并通过工作流程发送它们 因此 编辑可能会创建一篇文章并发送给
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • 以编程方式检查 .class 文件是否扩展特定类

    我有一个问题 我已经尝试解决好几个小时了 在 Eclipse 插件中 我有一个 ArrayList 其中包含一些 java class 文件的完整路径 作为字符串 我想做的是检查列表中包含的类是否扩展了特定的类 我考虑过解析该文件 查找 e
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display

随机推荐

  • 卷积神经网络手写体识别

    CNN 背景 卷积 LeNet网络结构 C1 S2 C3 S4 C5 F6 输出 数据集 代码及运行结果 测试 CNN 1995年 Yann LeCun 与Yoshua Bengio 提出了convolutional neural netw
  • 编程每日一题_C程序设计_i++ 与 ++i

    描述 区分 i 与 i 之间差异 代码示例1 include
  • Leetcode1402.做菜顺序——逆序贪心

    文章目录 引入 题解 引入 在本周的双周赛中 有了这么一道题 一个厨师收集了他 n 道菜的满意程度 satisfaction 这个厨师做出每道菜的时间都是 1 单位时间 一道菜的 喜爱时间 系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以
  • javascript 判读字符串是否为数字

    javascript在通过parseIn或parseFloat将字符串转化为数字的过程中 如果字符串中包含有非数字 那么将会返回NaN 参考下面代码 parseInt Hello 10 return NAN parseInt 110 10
  • 算法模型部署- Docker

    一 什么是docker Docker是一个虚拟环境容器 可以将你本地开发开发环境 代码 配置文件等一并打包到一个容器中 然后发布到任意平台 部署到你想部署到的任意服务器中 二 模型部署为什么要使用docker 假设将本地项目部署到服务器中
  • mysql-字段设置Default值问题

    1 表中的shState字段设置了默认值0 可是新增的时候没有起作用 可能是因为Not Null没有打勾引起的 2 勾选后还是不行 新增报错 3 百度了下 原来是要设置int这种数值类型才会起作用 字符型不行 4 所以改成int类型 测试O
  • 机器学习——支持向量机学习

    支持向量机 Support Vector Machine SVM 不仅具有坚实的统计学理论基础 还可以很好地应用于高维数据 避免维度灾难问题 已经成为一种倍受关注的机器学习分类技术 为了解释SVM的基本思想 我们首先介绍一下最大边缘超平面
  • mysql的判断更新_mysql判断记录是否存在,存在则更新,不存在则插入

    向数据库插入记录时 有时会有这种需求 当符合某种条件的数据存在时 去修改它 不存在时 则新增 也就是saveOrUpdate操作 这种控制可以放在业务层 也可以放在数据库层 大多数数据库都支持这种需求 如Oracle的merge语句 再如本
  • 戴尔服务器调节风扇转速

    开机F10进入 Lifecycle 选择系统设置 高级硬件设置 选择iDARC设置 散热 散热选择最大性能 其余按需选择 点击 返回 完成 保存更改 一路点完成 然后重启
  • 时序预测

    时序预测 MATLAB实现IWOA BiLSTM和BiLSTM时间序列预测 改进的鲸鱼算法优化双向长短期记忆神经网络 目录 时序预测 MATLAB实现IWOA BiLSTM和BiLSTM时间序列预测 改进的鲸鱼算法优化双向长短期记忆神经网络
  • Go语言面试题--进阶提升(6)

    文章目录 1 下面的代码输出什么 2 下面的代码输出什么 3 下面的代码输出什么 4 下面的代码输出什么 5 下面代码有什么问题吗 6 下面代码输出什么 请说明 1 下面的代码输出什么 type T struct n int func ma
  • Android设备的序列号与ro.serialno

    Android设备的序列号是通过获取Property ro serialno 的值取得的 ro serialno 的值一般来源于内核启动参数中的 ro boot serialno 在rk3368 Android6 0中 uboot读取idb
  • 微信小程序项目刚建好编译就报错

    出现的错误如下 1 Cannot delete property WeixinJSBridge 2 Argument 0 must be a buffer source or a WebAssembly Module object 出现这个
  • 前端 阿拉伯数字不换行

    对于一般的div 自要设置了width 如果容器里面的文字过多 则文章就会自动换行 但是如果输入连续的英文字符 则设置的width 不会生效 容器会被撑开 比如 一般div超过宽度能换行 对于div p等块级元素 正常文字的换行 亚洲文字和
  • 挖矿病毒攻击的排查处置手册

    一 背景 在用户不知情或未经允许的情况下 占用系统资源和网络资源进行挖矿 影响用户的网络和资源 从而获取虚拟币牟利 为了帮助应对恶意挖矿程序攻击 发现和清除恶意挖矿程序 防护和避免感染恶意挖矿程序 整理了如下针对挖矿活动相关的现状分析和检测
  • 【FPGA基础篇】底层结构组成

    文章目录 前言 CPU和DSP FPGA ASIC对比 FPGA和CPLD比较 FPGA基础 IOB 输入输出单元 CLB 可编程逻辑模块 LUT 查找表 MUX 选择器 复用器 Carry Chain 进位链 Flip Flop 触发器
  • SHELL 脚本定期删除日志文件(日志定期清理)

    假设我们的应用每天会产生一个日志文件 但我们并没有对日志文件做任何归档处理 久而久之日积月累 就会将磁盘空间占满 从而影响系统的正常运行 分析磁盘空间占用情况 当前磁盘空间占用情况 df h 当前目录文件大小列表 ll lh 文件列表按时间
  • 解决Python的your data either using array.reshape(-1, 1) if your data has a single featur

    今天写关于决策树的一些算法的时候 卧槽 mmp 竟然出现了红色的警示错误 oneRowX 0 0 1 0 1 1 0 0 1 0 newRowX 1 0 0 0 1 1 0 0 1 0 Traceback most recent call
  • verilog开发调试入门

    verilog开发调试入门 日常踩坑 记录调试经验 希望帮到初学者 2022 09 26 非阻塞赋值 注意在时序电路内部使用 lt 仿真波形不动 检查代码无误后 考虑分频间隔过大 仿真长度不够 憨憨落泪 上板 生成比特流失败 遇如下警告 C
  • ios笔记--class关键字,Category,protocol和block笔记

    1 class关键字介绍 1 概念 只是声明是一个类 但是调用不了这个类里面的方法 2 作用 只是定义成员变量 属性 3 好处 当import导入的文件里面的方法变动了 引用的地方也要跟着改变 而且还需要重新编译一次 影响程序效率 但是使用