ios下 协议与类别,用途很多

53、深入探索iOS开发:类别、扩展、协议与基础类 本文深入探讨了iOS开发中的核心概念,包括类别、扩展、协议和基础类,详细解析了它们的概念、应用场景及使用方法。同时,通过综合案例演示了如何在实际开发中灵活运用这些技术。文章还提供了开发建议、性能考虑以及未来发展趋势,帮助开发者更高效地组织代码并优化性能。 阅读详情

本文将介绍Objective-C语言的新物性,其中类别(categories)允许在现有的类中添加用户自己的方法,而协议则是Objective-C语言中特有的一种继承方式,类似于java语言中的接口。下面我将首先介绍它们的作用,还将以自己在工程中的实例予以分析。

 

   一、类别

   有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类。比如,当工程已经很大,代码量比较多,或者类中已经包住很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。

  注意:类别只能扩充方法,而不能扩充成员变量。

 

  实例分析:

  1、目的:在我的工程中,我需要对图片进行压缩,此时我想到类别,利用类别对UIImage类进行扩展,增加图片压缩方法。

  2、类别定义:

类别.h声明文件

 

#import <Foundation/Foundation.h>

 

@interface UIImage (UIImageExt)

//这个方法就是我添加的图片压缩的方法

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize;

@end

 

 

类别.m实现文件

 

 

#import "UIImageExt.h"

 

@implementation UIImage (UIImageExt)

 

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize

{

UIImage *sourceImage = self;

UIImage *newImage = nil;

CGSize imageSize = sourceImage.size;

CGFloat width = imageSize.width;

CGFloat height = imageSize.height;

CGFloat targetWidth = targetSize.width;

CGFloat targetHeight = targetSize.height;

CGFloat scaleFactor = 0.0;

CGFloat scaledWidth = targetWidth;

CGFloat scaledHeight = targetHeight;

CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

 

if (CGSizeEqualToSize(imageSize, targetSize) == NO)

{

CGFloat widthFactor = targetWidth / width;

CGFloat heightFactor = targetHeight / height;

 

if (widthFactor > heightFactor)

scaleFactor = widthFactor; // scale to fit height

else

scaleFactor = heightFactor; // scale to fit width

scaledWidth= width * scaleFactor;

scaledHeight = height * scaleFactor;

 

// center the image

if (widthFactor > heightFactor)

{

thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;

}

else if (widthFactor < heightFactor)

{

thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;

}

}

 

UIGraphicsBeginImageContext(targetSize); // this will crop

 

CGRect thumbnailRect = CGRectZero;

thumbnailRect.origin = thumbnailPoint;

thumbnailRect.size.width= scaledWidth;

thumbnailRect.size.height = scaledHeight;

 

[sourceImage drawInRect:thumbnailRect];

 

newImage = UIGraphicsGetImageFromCurrentImageContext();

if(newImage == nil)

NSLog(@"could not scale image");

 

//pop the context to get back to the default

UIGraphicsEndImageContext();

return newImage;

}

 

@end

   3、如何使用类别
   在上文我已经对UIImage进行了扩展,下面如何将演示在我的工程中如何调用该方法:

//根据图片tag显示图片

-(void)showPhotoBySerialNumber:(int)imageTag;

{

//这个largeImageArray是NSMutableArray类型的,存放图片存储路径,根据路径得到UIImage

UIImage *img = [UIImage imageWithContentsOfFile:[self.largeImageArray objectAtIndex:imageTag]];

//MyScrollView是我自定义的ScrollView,目的是使ScrollView响应点击事件,关于如何自定义的ScrollView在以后的博客中,我将会阐述

MyScrollView *scrView = [[MyScrollView alloc] initWithFrame:CGRectMake(340*imageTag, 0, 320, 480)];

scrView.host = self;

//这句就是调用了类别,通过UIImage实例对象,调用imageByScalingAndCroppingForSize:类别

scrView.image = [img imageByScalingAndCroppingForSize:CGSizeMake(320.0, 480.0)];

scrView.tag = imageTag+100;

//下面这句,就是把上面的scrView塞到imageScrollView上,imageScrollView是UIScrollView类型

[self.imageScrollView addSubview:scrView];

[scrView release];

 

}

 

    二、协议

   协议(protocol)类似于java语言里的接口(interface),定义了一组方法,而不提供具体实现, 只有那些“遵守”(conform to)或“采用”(adopt)了这些Protocol的类来给出自己的实现。协议不是类本身,它们仅定义了其它对象有责任实现的接口。当在自己的类中实现协议的方法时,用户的类就是遵守这个协议的,协议声明的方法可以被任何一个类实现。

  1、协议的语法结构如下:

  @protocol ProtocolName   //协议名

   methodDeclaration;        //方法名
  @end
  2、如何使用协议
  而在类声明时,语法如下:

  @interface ClassName : ParentClassName < ProtocolName>

  

  然后在该类的实现文件中,实现该协议的方法methodDeclaration

 

  3、实例分析

  下面以在我的工程项目中协议的使用方法,这里只要讲我自己定义的协议。

  1)该实例的目的:使在ScrollView上面的UIImageView响应点击事件

  2)协议定义:

 

在类的.h声明文件中定义协议

 

 

#import <Foundation/Foundation.h>

//协议ImageTouchDelegate

@protocol ImageTouchDelegate

//协议中声明的方法

-(void)imageTouch:(NSSet *)touches withEvent:(UIEvent *)event whichView:(id)imageView;

@end

 

@interface ImageTouchView : UIImageView {

id<ImageTouchDelegate>  delegate;

}

@property(nonatomic,assign)id<ImageTouchDelegate> delegate;

@end

 

 

该类的.m实现文件如下

 

#import "ImageTouchView.h"

 

 

@implementation ImageTouchView

@synthesize delegate;

 

-(id)initWithFrame:(CGRect)frame

{

if (self == [super initWithFrame:frame])

{

[self setUserInteractionEnabled:YES];

}

return  self;

}

-(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view

{

return YES;

}

 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

[delegate imageTouch:touches withEvent:event whichView:self];

}

 

@end

 

   3)如何使用协议?

   前面我已经定义了ImageTouchDelegate,那么如何使用该协议的方法呢?当某个类要采用该协议时,在类的声明中列出协议的名称即可,如果要采用多个协议时,在后面的尖括号中以逗号分隔,加入即可。当在类采用了该协议时,就要在除了.h文件中进行声明外,还必须在它的.m实现文件中对声明的协议中的方法进行实现。还以上述我们已经定义好的协议为例,演示在我的工程中如何实现该协议。

  在我的类中,首先在.h声明文件中,采用协议ImageTouchDelegate

 

 

#import <UIKit/UIKit.h>

//引入定义协议ImageTouchDelegate的头文件

#import "ImageTouchView.h"

//把协议名放到父头后面的尖括号里面,如果有多个协议,用逗号分隔

@interface PhotoOnShotViewController : UIViewController<ImageTouchDelegate> {

 

}

 

@end

 

 

  下面要在类的.m实现文件中实现该协议定义的方法

 

#import "PhotoOnShotViewController.h"

 

@implementation PhotoOnShotViewController

 

 

 

//实现协议中定义的方法,

-(void)imageTouch:(NSSet *)touches withEvent:(UIEvent *)event whichView:(id)imageView{

 

}

 

 

 

@end

 

 

   类别与协议在IOS开发中应用很广,也很实用,有必要掌握它们!

   好了,关于类别和协议的简单应用已经叙述完毕,有不到之处欢迎网友指教,希望得到更多的交流!

引用:http://blog.youkuaiyun.com/pjk1129/article/details/6458644

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释) 本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。 阅读详情

相关推荐

射频功率放大器设计实战:从理论到Layout的全流程解析

本文以一款40W、960MHz LDMOS功率放大器为例,系统解析了从理论分析、仿真设计到版图实现的射频功率放大器设计全流程。内容涵盖AB类放大器选型、核心指标定义、稳定性分析、Load-Pull/源牵引仿真、史密斯圆图匹配、偏置网络设计,以及最终的谐波平衡仿真与版图电磁验证,为工程师提供了一套从理论到实践的完整设计方法论。

weixin_29266007的博客 249

iphone开发Objective-C新特性──类别与协议

    本文将介绍Objective-C语言的新物性,其中类别(categories)允许在现有的类中添加用户自己的方法,而协议则是Objective-C语言中特有的一种继承方式,类似于java语言中的接口。下面我将首先介绍它们的作用,还将以自己在工程中的实例予以分析。   一、类别   有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类。比如,当工程已经很大,代码量比较多,或者类中已经包住很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。  注意:

pjk1129专栏 5746

WPF的基础设施:XAML基础语法

XAML是WPF的核心标记语言,采用XML语法实现界面与逻辑分离。其基础语法包括:1)控件声明方式(特性语法和属性元素语法);2)x:Name与Name的区别(适用范围和编译行为);3)注释规范与代码折叠技巧;4)实用特性如属性继承、附加属性等。文章还提供了常见错误排查方法,建议通过实践练习掌握XAML开发技巧。全文系统介绍了XAML的核心语法与应用场景,是WPF开发者的基础学习指南。

Hare的博客 1757

【iOS知识学习】_协议(delegate)和类别(category)

在iOS开发中,协议和类别是用的非常多的功能。 协议(delegate):声明一系列的方法,可由任何类实施,即使遵守该协议的类没有共同的超类。协议方法定义了独立于任何特定类的行为。简单的说,协议就是定义了一个接口,其他类负责来实现这些接口。如果你的类实现了一个协议的方法时,则说该类遵循此协议。 协议的申明: @protocol MyProtocol @required -(void) me

weasleyqi的专栏 1万+

ThingsBoard - 设备接入

设备接入笔记

qq_53839898的博客 1455

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1344

ios之浅谈分类、类的扩展、协议以及协议的使用

一、分类 1.在不改变原有类的基础上为类添加方法,只能添加方法,由此延伸到继承,而继承呢不但可以扩充方法,还可以添加属性。 2.分类可以有多个,也就是一个类可以有多个分类。 3.分类的用途: (1)可以为系统的类添加我们想要的方法,比如,我们在写程序的用到tableView,有时候没有网络或者服务器停止时,界面刷新不出来,我们需要展位图提醒用户,这时我们可以用类别的方法,为UITableV

奔跑的蜗牛 1364

FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地

一、环境介绍 操作系统介绍:ubuntu 18.04 FFMPEG版本: 4.4.2 摄像头: USB摄像头、虚拟机挂载本机自带摄像头 二、FFMPEG与X264下载编译 X264下载地址: http://www.videolan.org/developers/x264.html FFMPEG下载地址:https://ffmpeg.org/download.html Yasm ...

8873

IOS协议·IOS分类·IOS扩展(总结)

1.协议 1.1 是一种要求,或是一种规则 1.2 对应程序来讲,是只生成方法的声明,不实现 1.3 协议必须被某个类采纳,且在该类中给出协议中声明的方法函数体 1.4 对于采纳协议类的对象,可以和其它对象一样使用 1.5 协议可以被继承,包括多个父协议 1.6 协议可以被多重采纳下面一起看一下简单的demo理解协议的使用 定义协议MyProtocol.h@protocol MyPro

lee727n的博客 868

Go语言全面解析:从入门到精通

Go语言是由Google开发的一种静态类型、编译型编程语言,具有简洁、高效、安全的特点。它特别适合高并发服务、云原生应用和网络编程等场景。Go采用Goroutine和Channel实现轻量级并发,性能接近C/C++。与其他语言相比,Go语法更简洁但类型更严格,编译速度快且跨平台支持好。虽然Go支持多种设计模式和编程范式,但其面向对象实现方式与传统语言不同。标准库丰富且拥有Gin、GORM等企业级框架。核心语法包括包管理、变量声明、函数定义、流程控制等,适合构建高性能后端服务和系统工具。

博哥哥的博客 4925

装配完整性检查系统:基于YOLOv10的螺丝/零件缺失自动检测(含UI界面与完整代码)

建议自行采集装配场景数据,标注缺失螺丝、错误零件等,模拟真实缺陷。手机/工业相机采集图像;使用LabelImg进行目标标注;转换为 YOLO 格式。本文构建了一个完整的装配完整性检测系统,基于 YOLOv10 实现高精度螺丝缺失检测,并使用 PyQt5 构建了图形界面,实现一键导入与可视化检测流程,适用于工业质检自动化部署。项目可灵活扩展至零件缺失、错装、错位、顺序错误等检测场景,是深度学习在制造业中落地的典型应用案例之一。

YOLO 702

iOS - 协议和分类型中的属性代表了什么

问题概述 Review别人代码, 经常会看到在协议或者分类中有属性的存在, 这可能会使新手感到很困惑; 因为在原则上Protocol或者Category中是不可以添加属性,但是一个iOS开发者一定会看到这样写的代码; 协议和分类型中的属性到底代表了什么呢? Code 样例 @protocol SQIDemoProtocol <NSObject> @property (nonato...

侯仕奇的博客 586

城市仿真软件:AnyLogic_(8).行人与人群动态仿真

定义行人个体的行为和属性,如行走速度、目标位置等。// 创建一个行人// 设置行走速度为1.5 m/s// 设置目标位置为入口// 创建另一个行人// 设置行走速度为1.2 m/s// 设置目标位置为出口// 创建行人// 创建乘客行人与人群动态仿真在城市规划、交通管理和紧急疏散等领域具有广泛的应用。通过AnyLogic提供的行人模型模块,可以有效地模拟行人的个体行为、群体动态和与环境的交互。

kkchenjj的博客 1250

iOS基础面试题(二)

iOS进阶面试题----Block部分 1.Difference between shallow copy and deep copy? 浅复制和深复制的区别? 答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。 深层复制:复制引用对象本身。 意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的

cym_bj 644

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

iOS面试资料整理

前言: 最近把 iOS 面试中可能会遇到的问题整理了一番, 题目大部分是网上收录的, 方便自己巩固复习, 也分享给大家; 希望对大家有所帮助! 对于答案,不一定都合适,欢迎大家积极讨论;整理不易,如果您觉得还不错,麻烦在文末 “点个赞” ,或者留下您的评论“Mark” 一下,谢谢您的支持 目录合集 iOS面试题--面试常问问题(一) iOS面试题--面试常问问题(二) iOS面试题--面试常问问题(三) iOS面试题--常问UI问题(四) iOS面试题--常问内存管理问题(五) iOS面试题

奋斗吧灬青年的博客 219

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

收集了一些iOS技术面试题,试试你能通过吗?

收集了一些iOS技术面试题,试试你能通过吗? 以前也看到过这个,自己还试着作答,先贴上来. 1.Difference between shallow copy and deep copy? 答:看了书的351页大概明白了,不过356页还是木有看懂 Foundation类实现了copy和mutableCopy方法,默认执行浅拷贝。 shadow copy:创建对象引用的副本。 deep

且行且看 759

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS技术面试题

收集了一些iOS技术面试题,试试你能通过吗? iOS知识问题: Difference between shallow copy and deep copy? What is advantage of categories? What is difference between implementing a category and inheritance? Diff

Care iOS技术团队 5602

ios巩固之一 类别,协议

开发ios也快两年了。总是浮浮躁躁,没有好好回过头来整理知识点,都是用到什么学什么。虽然项目已经从无到有,上线一段时间了。但是自我感觉开发功底着实不够,特别是基础功。一个半路出家的野路子是时候开始磨磨刀了。 1.类别:为现有类添加新行为的方法。实际上是OC的一种动态行为,也就是利用了运行时机制。 要点:不能在类别里面声明实例变量;类别不能解决命名冲突,如果同名则会覆盖类中方法。 2.协议:关

~!麽黛誌 !~ 602

iOS协议、代理、Block和回调、类别

【协议】(Protocol) //协议是用来规范接口,实现对象间交互的一种机制。类似于JAVA中的接口,可以模拟。 协议的权限 @optional//可选的 @required//必须的 【代理】 一.代理的概念 【注】代理是实现两个类的对象间通信的一种机制。 【委托方】主动方...

chounie9218的博客 148

IOS学习笔记5—Objective C—类别和协议

类别:扩展已存在类的内置功能(无需继承便可扩展类的功能) 类别可以扩展类之前不存在的一个属性,不能像继承那样给类别接口添加实例变量,而是要扩展一个类的行为 除了对现有类增加新的行为之外,类别还支持对自己构建的类把相关方法分组到多个单独文件中 在m文件中用匿名类别可以实现方法或属性的私有化 在import之后添加: interface 类名(){ 私有化属性 } 协议

Ryan's zone 7733

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式。 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类。 类别使得无需创建对象类的子类就能完成同样的工作 一、创

1473

ios-5-类别和协议

类别:扩展已存在类的内置功能(无需继承便可扩展类的功能) 类别可以扩展类之前不存在的一个属性,不能像继承那样给类别接口添加实例变量,而是要扩展一个类的行为 除了对现有类增加新的行为之外,类别还支持对自己构建的类把相关方法分组到多个单独文件中 在m文件中用匿名类别可以实现方法或属性的私有化 在import之后添加: interface 类名(){ 私有化属性 } 协议:协...

weixin_30414245的博客 72

半路出家, 我的iOS自学之路-2-头文件, 属性, 引用计数, 协议, 类别, 类扩展

半路出家, 我的iOS自学之路-2-头文件, 属性, 引用计数, 协议, 类别, 类扩展 我是一只绝望的菜鸟, 只学过Java, 半路出家, 自学iOS. 以下是我读完《Objective - C 编程》(第2版)的读书笔记 博客中出现任何差错, 遗漏, 还请您在评论中告诉我 群号:653592167, 欢迎自学iOS的人加入, 一起交流, 共同成长 .h文件 也叫 头文件, ...

lzhp123456的博客 464
上一篇: 最近收集一些ios开发技术博客来看,大家有好的,也可以回复
下一篇: 音频项目思路整理
威尚
博客等级 码龄17年 13粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值