OutMan——单例模式、代理模式以及iOS沙盒(sandbox)机制

单例模式(singleton)

一、单例模式的概念
        单例模式的意图是:类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源

二、单例模式的使用场合
1. 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法
2. 这个唯一的实例只能通过子类进行扩展,而且扩展的对象不会破坏客户端的代码

三、单例模式设计的要点
(1)某个类只能有一个实例
(2)它必须自行创建这个对象
(3)必须自行向整个系统提供这个实例
(4)为了保证实例的唯一性,我们必须将以下方法的实现方法进行覆盖

- (id)copyWithZone:(NSZone *)zone;
+ (instancetype)allocWithZone:(struct _NSZone *)zone;
- (NSUInteger)retainCount;
- (id)retain;
- (oneway void)release;
- (instancetype)autorelease;

这些方法的实现方法覆盖的固定格式:

// 将copyWithZone:的实现方法覆盖
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

// 将allocWithZone:的实现方法覆盖
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    @synchronized(self)
    {
        if (instances == nil)
        {
            // 调用父类的alloc
            instances = [super allocWithZone:zone];
            return instances;
        }
    }
    return instances;
}

// 将retainCount的实现方法覆盖
- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}

// 将retain的实现方法覆盖
- (id)retain
{
    return self;
}

// 将release的实现方法覆盖
- (oneway void)release
{

}

// 将autorelease的实现方法覆盖
- (instancetype)autorelease
{
    return self;
}

(5)必须提供一个接入点(特殊的类方法)

四、单例模式的简单实现
        设计要求:设计一个singletonTools类(提供一个接入点,类中包含信息的setter和getter),Person类(Person类有个对象方法share方法),Dog类(Dog类中有一个对象方法receive方法),Cat类(Cat类中有个对象方法receive方法),通过调用Person对象中的share方法,可以设定想要共享的信息,通过调用Dog对象中的receive方法,可以获取到Person类共享的信息,通过调用Cat对象中的receive方法,可以获取到Person类共享的信息
(1)SingletonTools类的设计
                                                                     SingletonTools.h文件

#import <Foundation/Foundation.h>

@interface SingletonTools : NSObject<NSCopying>

// 可以传递int类型的数据
@property(nonatomic, assign)int num;
// 可以传递NSString类型的数据
@property(nonatomic, copy)NSString *imgs;

// 单例的类,提供的接入点(特殊的类方法)
+ (instancetype)shareInstances;
@end

                                                                     SingletonTools.m文件


#import "SingletonTools.h"

// 定义一个全局变量
static SingletonTools *instances = nil;

@implementation SingletonTools
// 将copyWithZone:的实现方法覆盖
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

// 将allocWithZone:的实现方法覆盖
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    @synchronized(self)
    {
        if (instances == nil)
        {
            // 调用父类的alloc
            instances = [super allocWithZone:zone];
            return instances;
        }
    }
    return instances;
}

// 将retainCount的实现方法覆盖
- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}

// 将retain的实现方法覆盖
- (id)retain
{
    return self;
}

// 将release的实现方法覆盖
- (oneway void)release
{

}

// 将autorelease的实现方法覆盖
- (instancetype)autorelease
{
    return self;
}

// 单例类的接入点方法
+ (instancetype)shareInstances
{
    // 判断的目的:保证对象的唯一
    if (instances == nil)
    {
        // 说明单例对象第一次使用,所以创建一个对象
        instances = [[SingletonTools alloc] init];
        return instances;
    }

    // 单例对象不是第一次使用,则直接返回
    return instances;
}
@end

-设计注意:
1. 必须提供一个接入点(特殊的类方法)
2. 必须将一些方法的实现方法覆盖(固定格式)
3. 要将copyWithZone:实现方法覆盖的时候,要遵守NSCopying协议
4. 必须要保证SingletonTools类的对象唯一

(2)Person类的设计
                                                                     Person.h文件


#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)share;

@end

                                                                     Person.m文件


#import "Person.h"
#import "SingletonTools.h"

@implementation Person
- (void)share
{
    // 创建单例对象
    SingletonTools *instances = [SingletonTools shareInstances];
    // 设置共享的信息
    instances.num = 22333333;
    instances.imgs = @"I believe I can fly";

}
@end

-设计注意:
1. 在share方法中,先创建单例对象
2. 通过调用单例对象的set方法,设置共享的信息

(3)Dog类的设计
                                                                     Dog.h文件


#import <Foundation/Foundation.h>

@interface Dog : NSObject

- (void)receive;

@end

                                                                     Dog.m文件


#import "Dog.h"
#import "SingletonTools.h"

@implementation Dog
- (void)receive
{
    // 创建单例对象
    SingletonTools *instances = [SingletonTools shareInstances];
    // 获取Person类中共享的信息
    NSLog(@"Dog中接收Person类中共享的信息为:%d-----%@", instances.num, instances.imgs);
}
@end

-设计注意:
1. 在receive方法中,先创建单例对象
2. 通过调用单例对象的get方法,获取共享的信息

(3)Cat类的设计
                                                                     Cat.h文件


#import <Foundation/Foundation.h>

@interface Cat : NSObject

- (void)receive;

@end

                                                                     Cat.m文件


#import "Cat.h"
#import "SingletonTools.h"

@implementation Cat
- (void)receive
{
    // 创建单例对象
    SingletonTools *instances = [[SingletonTools alloc] init];

    // 由于覆盖了SingletonTools类中覆盖了一些方法的实现方法,所以进行release,instances对象也不会销毁
    [instances release];
    [instances release];

    // 获取Person类中共享的信息
    NSLog(@"Cat中接收Person类中共享的信息为:%d-----%@", instances.num, instances.imgs);
}
@end

-设计注意:
1. 在receive方法中,先创建单例对象
2. 通过调用单例对象的get方法,获取共享的信息
3. 由于在SingletonTools类中覆盖了一些方法的实现,所以即使进行release、autorelease、retain等操作,都不会销毁单例对象,单例对象只有在程序退出的时候,才会被销毁

(4)main.m文件
这里写图片描述

protocol代理模式

一、代理模式设计概念
        代理模式的概念:传入的对象,代替当前类完成某个功能,称为代理模式

二、利用协议实现代理模式的主要思路
(1)定义一个协议,里面声明代理类需要实现的方法列表(比如这里一个代理类需要实现feedBaby和putBabyToBed)
(2)创建一个代理类(比如BaoMu),遵守上面的代理协议
(3)在需要代理的类中(Baby),定义一个对象类型为id且遵守协议的成员变量delegate
(4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
(5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理)赋值

三、protocol代理模式的应用场合
        当对象A发生一些行为,想要告知对象B(让对象B成为对象A的代理对象)
        当对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
        当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
(1)通知的场合
baby发生了一些行为,想告知保姆
(2)监听的场合
保姆想监听baby的一些行为
(3)有些事情不想自己处理,想交给别人处理
baby发生了一些行为,但是自己不会处理,可以交给保姆处理

四、protocol代理模式的应用
        代理模式是在OC中经常遇到的一种模式,什么是代理模式呢?举个例子来说:有个婴儿他本身不会自己吃饭和洗澡等等一些事,于是婴儿就请了个保姆,于是婴儿和保姆之间就商定了一个协议,协议中明确了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的方法成为代理人
        设计要求:当baby饿了的时候,保姆喂baby吃东西,当baby困了的时候,保姆哄baby睡觉
(1)lookBabyProtocol协议的设计
                                                                     lookBabyProtocol.h文件


#import <Foundation/Foundation.h>

@protocol lookBabyProtocol <NSObject>

// 喂baby吃
- (void)feedBaby;
// 哄baby睡觉
- (void)putBabyToBed;

@end

-设计注意:
1. 在lookBabyProtocol协议中,要声明想要成为baby的代理需要实现的方法列表

(2)BaoMu类的设计
                                                                     BaoMu.h文件


#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"

@interface BaoMu : NSObject<lookBabyProtocol>

@end

                                                                     BaoMu.m文件


#import "BaoMu.h"

@implementation BaoMu
- (void)feedBaby
{
    NSLog(@"保姆在喂baby吃");
}

- (void)putBabyToBed
{
    NSLog(@"保姆在哄baby睡觉");
}

@end

-设计注意:
1. 创建的BaoMu类要遵守lookBabyProtocol协议
2. 只有遵守了lookBabyProtocol类,将来才可以去充当baby的代理

(3)Baby类的设计
                                                                     Baby.h文件


#import <Foundation/Foundation.h>
#import  "lookBabyProtocol.h"

@interface Baby : NSObject

@property(nonatomic, strong)id<lookBabyProtocol> delegate;

// baby想吃东西
- (void)wantEat;
// baby想睡觉
- (void)wantSleep;

@end

                                                                     Baby.m文件


#import "Baby.h"

@implementation Baby
- (void)wantEat
{
    NSLog(@"baby饿了");
    // 调用代理的喂baby吃方法
    [_delegate feedBaby];
}

- (void)wantSleep
{
    NSLog(@"baby困了");
    // 调用代理的哄baby睡觉方法
    [_delegate putBabyToBed];
}
@end

-设计注意:
1. 在Baby类中,要定义一个对象类型为id且遵守lookBabyProtocol协议的成员变量delegate
2. 在Baby想睡觉和想吃东西的时候,调用成员变量_delegate的方法
3. 只有遵守了lookBabyProtocol协议的人,才可以当baby的代理人

(4)main.m文件
这里写图片描述

MVC模式

M: model(模型)
V:view(视图)
C:controller(控制器)

iOS沙盒(sandbox)机制

一、沙盒的基本概念和作用
        每个ios应用都有自己的沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许访问其他应用的应用沙盒(在ios8中已经开放访问(extension))
        extension是ios8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS沙盒机制对应用间通信的限制
        应用沙盒一般包括以下几个目录:应用程序包、Documents、Library(下面有Caches和Preference目录)和tmp
应用程序包:包含所有的资源文件和可执行文件
Documents:存放应用程序运行时生成的需要持久化的数据,iTunes会自动备份该目录
tmp:存放应用程序运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除
Library:存放程序的默认设置和其他状态信息,iTunes会自动备份该目录
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出时删除,一般存放体积比较大,不是特别重要的资源
Library/Preferences:保存应用程序的偏好设置,iOS的setting(设置)应用会在该目录下查找应用的设置信息,iTunes会自动备份该目录(SQLite也存在这里)

二、沙盒路径的获取方法
(1)获取沙盒路径(沙盒根目录)
这里写图片描述
-使用注意:
1. 通过调用NSHomeDirectory( )函数,获取沙盒路径

(2)获取Documents目录路径
这里写图片描述
-使用注意:
1. 第一个参数:要获取的沙盒文件夹名称
2. 第二个参数:
NSUserDomainMask = 1,// 用户主目录
NSLocalDomainMask = 2, // 当前主机
NSNetworkDomainMask = 4, // 网络中可见的主机
NSSystemDomainMask = 8, // 系统目录
NSAllDomainsMask = 0x0ffff, // 全部
3. 第三个参数:YES:获取全部路径 / NO:不获取全部路径
4. NSSearchPathForDirectoriesInDomains( )函数返回值为NSArray类型

(3)获取Caches目录路径
这里写图片描述
-使用注意:
1. 第一个参数:要获取的沙盒文件夹名称
2. 第二个参数:
NSUserDomainMask = 1,// 用户主目录
NSLocalDomainMask = 2, // 当前主机
NSNetworkDomainMask = 4, // 网络中可见的主机
NSSystemDomainMask = 8, // 系统目录
NSAllDomainsMask = 0x0ffff, // 全部
3. 第三个参数:YES:获取全部路径 / NO:不获取全部路径
4. NSSearchPathForDirectoriesInDomains( )函数返回值为NSArray类型

(4)获取Library目录路径
这里写图片描述
-使用注意:
1. 第一个参数:要获取的沙盒文件夹名称
2. 第二个参数:
NSUserDomainMask = 1,// 用户主目录
NSLocalDomainMask = 2, // 当前主机
NSNetworkDomainMask = 4, // 网络中可见的主机
NSSystemDomainMask = 8, // 系统目录
NSAllDomainsMask = 0x0ffff, // 全部
3. 第三个参数:YES:获取全部路径 / NO:不获取全部路径
4. NSSearchPathForDirectoriesInDomains( )函数返回值为NSArray类型

(5)获取tmp目录路径
这里写图片描述
-使用注意:
1. 通过调用NSTemporaryDirectory()函数,获取tmp目录路径

(6)如果想在Preferences文件下创建一个1.text文件,里面内容是I believe I can fly
这里写图片描述
这里写图片描述


                                        —— 如果您有不同的见解,请随时指出,期待与您的交流!——


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我对敏捷开发有一定的了解。敏捷开发是一种注重快速迭代、灵活响应需求变化的软件开发方法论,强调团队合作、用户参与和持续交付。在项目中,应用敏捷开发方法论可以使团队更加高效、灵活和适应变化,从而提高项目的成功率和客户满意度。 在敏捷开发中,常用的实践包括: 1. 迭代开发:将项目分解成多个短期的迭代周期,每个迭代周期都能够交付可用的软件产品。 2. 用户故事:通过与用户沟通,将需求分解成小而明确的用户故事,以便开发人员更好地理解和实现。 3. 持续集成:将代码集成到主干代码库中,通过自动化测试来确保代码的质量和稳定性。 4. 自组织团队:团队成员自主决策,通过合作完成任务,提高项目的效率和质量。 在项目中,应用敏捷开发方法论需要遵循以下原则: 1. 响应变化:及时响应需求变化,不断调整项目计划和开发方向。 2. 交付价值:每个迭代周期都要交付可用的软件产品,以便用户可以快速获得价值。 3. 用户参与:与用户保持紧密联系,通过用户反馈来指导开发工作。 4. 合作沟通:团队成员之间要保持良好的沟通和合作,及时解决问题。 总之,敏捷开发是一种注重快速迭代、灵活响应需求变化的软件开发方法论,通过迭代开发、用户故事、持续集成和自组织团队等实践来提高项目的效率和质量。在项目中,应用敏捷开发方法论需要遵循响应变化、交付价值、用户参与和合作沟通等原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值