黑马程序员_OC_protocol学习

Objective-C协议与代理模式
本文介绍了Objective-C中的协议概念及其使用方法,并详细讲解了如何通过协议实现代理模式,包括定义协议、实现协议的类以及如何在实际场景中运用代理模式。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------


协议的声明看起来比较类似于Java中一个类的接口,但是和接口不同的是:协议没有父类也不能定义实例变量。
1. 基本用途
     1.1 可以用来声明一大堆方法(不能声明成员变量)
     1.2 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
     1.3 只要父类遵守了某个协议,就相当于子类也遵守了




2.关键子:
2.1 协议的关键字
@required:表示必须强制实现的方法
         @optional:表示可以有选择性的实现方法
        2.2 协议的实现方式




@protocol MyProtocol <NsObect>
 
//可以选择实现的方法:
@optional
-(void) optionalMethod1;
-(void) optionalMethod2;
//必须实现的方法:
@required
-(void) requiredMethod1;
@end




@implementation Test
 
-(void)optionalMethod1{
    //可选择实现方法1
}
-(void)optionalMethod2{
    //可选择实现方法2
}
-(void)requiredMethod1{
    //必须是实现方法2
}
@end
















3. 基协议
   3.1 NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
   3.2 其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
   3.3 NSObject协议中声明很多最基本的方法,比如description、retain、release等








4. 代理设计模式
   4.1 设计原理,有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做
   4.2 设计原则,首先一个类里面的这个成员必须实现了这个协议才可以.
   4.3 我们来实现一个模式为:妈妈把孩子交给保姆照顾






1.定义一个保姆协议:
@protocol Job <NSObject>
-(void)takeEat;
-(void)takeSleep;
-(void)takePlay;
-(void)takeShower;
@end






我们再声明Nurse类 即代理的人:
@interface Nurse : NSObject<Job>//实现该协议
@end
实现文件:
 
#import "Nurse.h"
@implementation Nurse
-(void)takeEat
{
    NSLog(@"小孩饿了,喂它吃饭");
}
-(void)takeSleep
{
    NSLog(@"小孩困了,哄他睡觉");
}
-(void)takePlay
{
    NSLog(@"小孩醒来了,陪他玩");
}
-(void)takeShower
{
    NSLog(@"晚上给小孩洗澡");
}
-(void)dealloc
{
    NSLog(@"Nurse is dealloc");
}
@end


再声明一个morther类:
#import <Foundation/Foundation.h>
#import "Job.h"
@class Nurse;
@interface Morther : NSObject
{
    NSString *name;
    id<Job> delegate;   //此处声明一个代理人,从而mother可以让代理人完成需要代理的事情
}
-(id)initWithName:(NSString *)_name delagat:(id<Job>)_delagete;  //传入代理人
@property(nonatomic,copy)NSString *name;
-(void)delagateThings;// 被代理的事情
@end
//实现文件
 
#import "Morther.h"
#import "Nurse.h"
@implementation Morther
-(id)initWithName:(NSString *)_name delagat:(id)_delagete
{
    self=[super init];
    if (self) {
        if (name!=_name) {
            [name release];
            name=[_name copy];
            [delegate release];
            delegate=[_delagete retain];
        }
    }
    return self;
}
@synthesize name;
-(void)dealloc
{
    [name release];
    [delegate release];
    NSLog(@"host is dealloc");
}
-(void)delagateThings
{
    int i;
    switch (i) {
        case 1:
            [delegate takeEat];
            break;
        case 2:
            [delegate takePlay];
            break;
        case 3:
            [delegate takeShower];
            break;
        case 4:
            [delegate takeSleep];
            break;
        default:
            break;
    }
    i++;
}
@end




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


    @autoreleasepool {
        
        NSString *name=[[NSString alloc] initWithFormat:@"小花"];


        Nurse *fengjie=[[Nurse alloc] init];//代理人 fengjie


        Morther *morther=[[Morther alloc] initWithName:name delagat:fengjie];//这样就将代理人传入mother 对象中,这样morther对象便可以通过nurse来完成她自己不能坐的事情了。
        [name release];
        [morther delagateThings];
        [morther release];
        [fengjie release];    
    }
    return 0;
}


所以我们代理模式要通过协议来完成



 ---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值