OC学习----设计模式

iOS学习之分享学习iOS的资源网站 官方文档 iOS Developer library cocoaPods iOS 删除已经配置的类库和移除CocoaPods Max OS X El 系统中安装cocoa pods完整教程(2016) Mac下cocoapods使用说明(2016版) iOS开发~CocoaPods使用详细说明 常用论坛/博客 优快云.blog 优快云.lib CocoaChina 简书 Co 阅读详情

设计模式

设计模式是用来解决编程某些特写问题.

单例模式

什么时候使用单例模式?

在一个工程中,有一些类只需要一个实例变量.我们就可以将这些类设计成单例模式.

单例模式的作用?

当一个类 A 被设计成单例模式时,由 A 构造出的实例对象相比于其它类来讲,其为全局实例对象.即在每一个类中由 A 构造出的实例对象,都为相同对象.

在OC中如何将一个类设计成单例模式?

1.在要被设计成单例的类的 .h 文件中声明一个构造单例方法,如:

    +(Student *)defaultIntance;
    //命名可以是 shareIntance,
    //也可以是 singleInstance

2.实现该方法

    +(Student *)defaultIntance{
        static Student *st = nil;//声明一个静态实例对象

        if (st == nil) {
        st = [[Student alloc] init];
        }

        return st;
    }

    //为了防止通过 alloc 或 new 创建新的实例对象
    +(id)allocWithZone:(struct _NSZone *)zone{
        @synchronized(self){
            if (st == nil) {
                st = [[super allocWithZone:zone ] init];
            }
        }
        return st;
    }

    //为了防止 copy 产生出新的对象,需要实现NSCopying协议
    -(id)copyWithZone:(NSZone *)zone{
        return self;
    }

观察者模式

什么是观察者模式?

在工程中,一些类去观察 A类 ,当 A类 发生变化时,这些观察类就会收到消息,做出相应反应.

什么时候使用观察者模式?

当一个类需要发送消息给多个类的时候,就用观察者模式.

观察者模式的作用?

一对多的发送消息

如何在OC中实现观察者模式?

OC中观察者模式的设计基础: KVC / KVO

KVC的由来:在ios2.0之前,并没有属性来访问类中的实例变量,那时候开发人员使用 键值编码 的方式来访问类中的实例变量,即 KVC 方式.

    Student *st = [[Student alloc] init];
[st setValue:@"yanshuxin" forKey:@"_name"];
[st setValue:[NSNumber numberWithInteger:21] forKey:@"_age"];
NSLog(@"des = %@",[st description]);


//访问
NSString *name = [st valueForKey:@"_name"];
NSNumber *age = [st valueForKey:@"_age"];
NSLog(@"name = %@,age = %ld",name,age);

//键路径编码
Book *book = [Book new];
    //    st.book = book;
    //    st.book.bookName = @"海贼王";
[st setValue:book forKeyPath:@"_book"];
[st setValue:@"海贼王" forKeyPath:@"_book._bookName"];
NSLog(@"%@",[book description]);

NSString *string = [st valueForKeyPath:@"_book._bookName"];

KVO的由来:在编程过程中,我们经常需要判断目标是否发生改变,以便及时的做出对应的处理.此时苹果公司就提供一种策略,即 OC运行时 提供了 KVO 技术.

KVO的实现:

1.注册成为观察者

    -(id)initWithStudent:(Student *)s{
        if (self = [super init]) {
            self.s = s;
            [self.s addObserver:self                        forKeyPath:@"_age"                              options:NSKeyValueObservingOptionNew |              NSKeyValueObservingOptionOld                    context:nil];
        }
        return self;
    }

2.观察者定义KVO回调

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"change = %@",change);
if ([change[@"new"] integerValue] <=18 ) {
    NSLog(@"不能小于18周岁.");
}
}

3.移除观察者

    -(void)dealloc{
NSLog(@"End");
[self.s removeObserver:self forKeyPath:@"_age" context:nil];
    }

代码示例:

#import "ViewController.h"
#import "Student.h"
#import "Monitor.h"

@interface ViewController ()
{
    Student *s;
    Monitor *m;
    Hero *hero;
    Sup *sup;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    s = [[Student alloc]init];
    [s setValue:[NSNumber numberWithInteger:21]         forKey:@"_age"];
    m = [[Monitor alloc] initWithStudent:s];

    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(reduce:)  userInfo:nil repeats:YES];    
}

-(void)reduce:(NSTimer *)sender{
    NSInteger age1 = [[s valueForKey:@"_age"] integerValue];
    age1 -= 1;
    if (age1 <= 18) {
        [sender invalidate];
    }
    [s setValue:[NSNumber numberWithInteger:age1] forKey:@"_age"];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

通知

通过学习 KVO ,我们发现 KVO 就是一种简单的观察者模式,涉及到两个对象,分别是观察者和被观察者.这种方式实质上有很大局限生,那么OC的 Foundation 框架又为开发者们提供了新的一种观察者设计模式,即 通知.

通知是一种发送给一个或者多个观察者,用来通知其在程序中发生了某个事件的消息.Cocoa中的通知机制遵循的是一种广播的模式.它是一种程序中事件的发起者或者是处理者和其他想要知道该事件的对象沟通的一种方式.

    //初始化一个NSNotification类的实例对象
NSNotification *notification1 = [NSNotification notificationWithName:@"MESSAGE" object:nil ];
NSNotification *notification2 = [NSNotification notificationWithName:@"MESSAGE" object:self userInfo:@{@"content",@"xxx"}];

其中:

1.name:表示通知名称,最好英文名,用来识别通知对象

2.object:表示通知的发起人

3.userInfo:表示通知的内容

在现实生活中,我们的邮件都需要由邮局发送给接收人.在OC中也一样, Foundation 框架定义了一个单例类,通知中心 NSNotificationCenter 来统一发送通知的实例对象给观察者.

通知中心发送通知:

[[NSNotificationCenter defaultCenter] postNotification:notification1];

建立通知发送机制,步骤如下:

1.注册相关监听者,并实现监听收到通知的方法.

    -(void)sendMessage{
[[NSNotificationCenter defaultCenter] postNotificationName:MESSAGE object:self userInfo:@{@"order":@"国王万岁"}];
}

-(void)doAction:(NSNotification *)notif{
NSDictionary *dic = [notif userInfo];
NSLog(@"工人们:%@",[dic objectForKey:@"order"]);
}

2.在需要的时候,被监听的对象去通知中心发送通知.

    -(id)init{
if (self = [super init]) {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:MESSAGE object:nil];
}
return self;
}

3.在 dealloc 方法中移除通知.

    -(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self name:MESSAGE object:nil];
}

委托模式

两个对象间不能够直接联系,需要通过一个第三方对象,帮助他们联系,这样一种模式,我们称之为委托模式.

如何在OC中使用委托模式?在OC中实现委托模式需要了解OC中的一个元素 protocol ,即协议.

协议

协议是一套标准,定义了应该实现什么,但不关心具体怎么实现.

在OC中的协议是由 protocol 声明的一组方法列表.

iOS开发深度指南:OC与Swift编程技术及应用 OC是一种多范式的编程语言,结合了面向对象编程和面向切片编程的特性。它是在C语言基础上,引入了Smalltalk风格的消息传递机制。OC广泛应用于苹果生态系统,是早期iOS应用开发的核心语言。在开发过程中,开发者经常会遇到需要创建自定义布局控件的场景。自定义控件布局通常涉及到继承UIView,并重写其布局方法,如,以便在运行时根据子视图的需求动态调整布局。// 在这里添加自定义布局代码// 例如,调整子视图的位置和大小等在上述例子中, 阅读详情

相关推荐

OC设计模式

OC设计模式

OC 模式指的是什么模式呀?应该如何理解呢?

作为“原创角色”,OC则是指不属于现有知识产权的角色,是由在线人员创建的。在Objective-C或类似的面向对象语言中,常用的设计模式包括但不限于单例模式、工厂模式、观察者模式、适配器模式等。然而,需要注意的是,OC本身并不直接代表一种特定的设计模式,而是可能指代在该语言或平台上实现的各种设计模式。超频是指将一个电子配件的时脉速度提升至高于厂方所定的速度运作,从而提升性能的方法。在社交媒体、论坛、游戏社区等场合,人们经常使用OC来标记自己的原创作品或角色,以表明其独特性和原创性。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 1571

ios设计模式开发23种设计模式OC编程

用最简单的方法实现23种设计模式,直接导入xcode的即可使用

oc中的设计模式

oc中的设计模式有 首先单例模式:在程序运行过程中初始化,并且单例的初始化只执行一次,其生命周期为单例对象初始化开始到程序结束

FL_14的BLOG 985

AMG8833红外测温实战:在STM32F103上做个简易人体感应与温度报警器

本文详细介绍了如何在STM32F103上使用AMG8833红外测温传感器构建人体感应与温度报警系统。通过硬件连接方案、驱动代码开发、人体检测算法实现及报警系统设计,展示了如何利用8x8红外温度矩阵实现智能监测功能。文章包含实用的初始化流程、温度数据读取优化和低功耗策略,为创客项目提供完整解决方案。

weixin_33725239的博客 393

保姆级教程:手把手教你用Jacquard V2数据集训练机器人抓取模型(附完整代码)

本文提供了一份详细的保姆级教程,手把手教你使用Jacquard V2数据集训练机器人抓取模型。从环境配置、数据准备到模型架构设计、训练优化和实际部署,全程解析并附完整代码,帮助开发者快速掌握视觉抓取技术。

weixin_29031057的博客 314

IOS开发中的几种设计模式介绍

ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。 优势:解耦合 敏捷原则:开放-封闭原则 实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。 列表row个数delegate 自定义的delegate

liwei3gjob的专栏 6万+

WinInet 编程:MFC 中的互联网编程

WinInet 是一套 Windows API(应用程序编程接口),用于实现互联网应用程序的网络通信和数据传输。WinInet 抽象了底层网络协议和硬件细节,为程序员提供了一套统一的接口,简化了互联网应用程序的开发过程。WinInet 广泛应用于各种 Windows 应用程序中,包括网页浏览器、下载管理器、网络游戏等。MFC WinInet 是一套强大的类库,为 MFC 程序员提供了在 Windows 平台上实现互联网通信和数据传输的工具。

JAZJD的博客 1637

OC学习之路(10) - 设计模式

(一)类之间的通讯方式(数据传递) 代理设计模式 一对一 一个类只能委托一个对象去完成一件事情 KVO(监听) 一对多 一个类可以监听多个类 单例模式 公共 所有类共用这个对象 通知中心 一对多 一个对象可以通知多个对象 (二)单

IT探险者-returningprodigal 492

重装系统后,恢复Oracle的.ORA文件

前几天,系统莫名奇妙产生很多宏病毒,进而感染整个C盘,不得已,格式化后重装了系统。 重装系统之后,突然想到D盘中的oracle中很多数据没导出来备份,安装文件下有很多有用的.ORA文件,抱着死马当活马医的态度,居然成功了。 1、将原来D盘(D:\oracle\product\10.2.0\oradata\orcl)下的数据文件备份下其他盘,将D盘的oracle目录名改成oracle1。安装数据

zhanggnol的blog 5551

ai获客系统功能代码

AI 获客系统是一个复杂的体系,以下为你提供一个简化的 Python 示例,聚焦于客户行为分析与销售线索筛选功能,模拟实现从多渠道收集数据后的初步处理流程。假设已有从官网、线上商城等渠道收集到的客户数据,以字典列表形式存储,每个字典包含客户基本信息及购买行为数据。通过分析客户购买频率与金额,筛选出高价值销售线索。python上述代码仅为基础示例,实际 AI 获客系统还涉及更复杂的数据采集、清洗、存储,以及运用机器学习算法进行深度客户洞察等功能。

weixin_ggwwsscc的博客 892

【OC学习-29】单例设计模式的理解、案例和简单总结

单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处? 简单来说: a:有的东西只能有一个,那就必须用单例; b:单例的好处就是不会有多余的实例,所以节约内存; c:因为只有一个单例,所以易于管理多线程对它的访问。

小小的客栈 大大的江湖 1273

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样

stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc

xtqbp的博客 4362

OC学习——OC中的@protocol(@required、@optional)、代理设计模式

一、什么是协议? 1.协议声明了可以被任何类实现的方法 2.协议不是类,它是定义了一个其他对象可以实现的接口 3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。 4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。 5:委托,就是调用自己定义方法,别的类来实现。 另外: 可以用来声明一大堆方法(不能声明成员变量) 只

onebutterfly 5512

用 ABAP CDS Table Function 把复杂计算下沉到 SAP HANA:从定义到 AMDP 实战与 Clean Core 落地

摘要 CDS table function 是 SAP S/4HANA 开发中的关键工具,它允许在 ABAP CDS 中调用由 HANA 原生执行的函数逻辑,并以表形式返回结果集。其核心价值在于:弥补 CDS 表达式不足,将复杂计算(如排序、分组、币种换算等)安全地推送到数据库层执行,同时保持 CDS 的可组合性。实现方式是通过 AMDP 框架,在 ABAP 类中编写 SQLScript 代码。使用时需注意参数设计应区分业务语义与过滤条件,并严格遵守 client-safe 原则以避免跨客户端数据泄露风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1003

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

嵌入式阿齐Archie 2万+

学习笔记:OC的protocol协议及代理设计模式

一、简单使用 1、基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了  2、格式 协议的编写 @protocol 协议名称 // 方法声明列表 @end 某个类遵守协议 @interface 类名 : 父类 协议名称1,协议名称2> @end

sifenkesi1的专栏 581

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

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

黑马程序员——OC学习——Protocol和代理设计模式

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1. 什么是protocol protocol定义了一些方法的声明,但是不实现,类似Java中的接口,自己只声明方法,但不实现,而由遵守了协议的类去实现方法。protocol声明方法,但是不能声明变量。 协议的作用——供其他类去遵守,如果一个类遵守了一个协议,就应该实现这个协议

Susie_CC的博客 612

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

iOS设计模式学习 (二) OC协议之接口继承和代理设计

大多数情况下我们在说Objective-C 的协议protocol时,我们首先想到的都是iOS中的重要设计模式——代理设计模式。在前面一节的学习中已经说到了代理设计模式,这儿就只简单的说一下:在代理设计模式中,我们使用到的都是协议的接口方法,协议定义了对象间的访问接口规则。但是,其实协议同样拥有属性,这就涉及到下面我们要说的接口继承。所谓接口继承,学过C++的应该都知道抽象类,其实通过继承抽象类,然

SakuraBurial的专栏 921

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式

分类(Category),代码块Block和protocol代理设计模式知识总结

fighting__bj的博客 892

奖学金文章更新 连载4第四篇 陈元威 海南IOS第一期学员

奖学金文章更新 连载4第四篇 陈元威 海南IOS第一期学员          随着日子慢慢的过去,脑中的知识也慢慢的增长,感觉到现在的学习进度也是挺快的,C语言结束没多久到现在OC语言也正式的告一段落了,在这日子里我们把OC语言的后面内容也学习完了,有类目、协议、委托设计模式还有内存管理的引用计数、对象所有权、自动释放池和@property还有后面的KVC、KVO、键值观察设计模式和谓词

wxhlcyw的博客 548

oracle consultation

today listening the oracle consultation about mid-ware, there has a lot of something you need to master. about ebs, bpel, oc4j. it is great in the technic study. i don't know how long i can master, an...

sam9901 168

Objective-C中C语言使用初步学习(2)

最近在进行iOS的深入学习,看过一些博客后意识到自己的代码写的过于臃肿。我从开始学习到现在的业务熟练都是使用的最基本的MVC模式,于是MVC中的C--controller代码十分臃肿,让接手代码的人无从下手。在网上查阅多篇博客后,才了解到有多种设计模式,虽然各有缺点,但是能让我借鉴到许多方法;然后还找到很多模块,比如YYKit等,可以优化、简化复杂的代码模块和逻辑。 现在我就在学习YYKit,发...

u012380572的博客 267

怎么入门iOS之OC_UI晋级学什么、

1. OC 语法初步, 你可能学到面向对象最近本的概念, 并且可以大致的建立几个自以为是的类,但这仅仅是开始、 你知道为什么面向对象要有3大特性么、知道他们是用到什么设计模式的么 2. 你可能学到了NSString, NSMutableString 字符串的基本操作方法, 你可能会花大量的时间去看那些方法。 从没考虑过方法的实用性。 UI方法成千上万, 大量的时间浪费到寻找上边可能会很累的。 所...

weixin_30670925的博客 156

不知道为什么,就是停不下来思考,接下来我要干嘛

  写一篇随笔,对于一个打算重新开始新生活,新工作的人,是要有足够的勇气的,哈哈,至于以前我的日子多么狼狈,我已经不是很在意了,年起嘛,总也会犯浑。 最近在学RN,还记得当初学OC的时候,3个月,白天8点学习,敲代码到晚上8点,整天没有一刻敢松懈,一直在思考这个该怎么处理,方法对不对,后面工作了,发现学得很狭隘,也没得到精髓,哈哈,不过起码知道整体的一个架构,基本数据类型,...

220
上一篇: OC学习----内存管理
下一篇: 关注程序员健康
25岁的大叔
博客等级 码龄13年 14粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值