OC进阶(六)

1.Copy

/*
   自定义类实现copy的功能:

   1) 创建一个类

   2) 遵守NSCopying协议

   3) 实现协议中声明的方法

   4) [对象 copy];

      目的:  产生一个副本对象
 */
#import <Foundation/Foundation.h>

@interface Dog : NSObject<NSCopying>
@property (nonatomic,assign) int tuiNum;
@property (nonatomic,assign) int speed;
@end
@implementation Dog
- (id)copyWithZone:(NSZone *)zone{

    NSLog(@"执行了copy方法");

    //
    Dog *d = [[Dog alloc] init];
    //new speed   jd speed
    d.speed = self.speed;
    d.tuiNum = self.tuiNum;

    return d;
}
@end
#import "Dog.h"
#import <Foundation/Foundation.h>

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

        Dog *jd = [Dog new];
        jd.speed = 230;
        jd.tuiNum = 8;
        //对象的copy
        //自定义对象的copy都是深拷贝
        Dog *byd= [jd copy];
        //byd.speed = 230
        //byd.tuiNum = 8
        NSLog(@"%d,%d",byd.speed,byd.tuiNum);

    }
    return 0;
}

2.单例模式

/*

     单例模式:

         对象在任何时候,都只有一个,好处是,在多个类之间共享数据

     设计要点:

         1) 保证唯一,程序运行期间必须唯一
         2) 单例类,必须提供一个接入点(特殊的类方法)

 */
#import <Foundation/Foundation.h>

@interface SingletonTools : NSObject<NSCopying>
@property (nonatomic,assign) int num;
@property (nonatomic,copy) NSString *text;

//单例的类,提供一个接入点
+(instancetype)shareInstances;
@end
#import "SingletonTools.h"

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

@implementation SingletonTools
-(id)copyWithZone:(NSZone*)zone{

    return self;
}
+(id)allocWithZone:(NSZone*)zone{

    //线程保护
    @synchronized(self) {

        if (instances == nil) {
            //调用父类的alloc
            instances = [super allocWithZone:zone];

            return instances;
        }

    }
     return instances;

}
-(id)retain{

    return self;

}
-(NSUInteger)retainCount{

    return NSUIntegerMax;
}
-(oneway void)release{

}
-(id)autorelease{

    return self;

}
//单例的接入点方法
+(instancetype)shareInstances{

    //目的:保证对象必须唯一
    if(instances == nil){

        //创建一个对象
        instances = [[SingletonTools alloc] init];
        return instances;

    }

    return instances;

}
@end
时间: 2024-08-03 09:49:39

OC进阶(六)的相关文章

6. 蛤蟆的数据结构进阶六之二叉树排序树

6. 蛤蟆的数据结构进阶六之二叉树排序树 本篇名言:"有些人因为贪婪,想得更多的东西,却把现在所有的也失掉了. -- 伊索" 关于理论知识已经在上篇中进行描述,这篇我们主要来看下如何是实现二叉排序树. 欢迎转载,转载请标明出处: 1.  二叉排序树的定义 二叉排序树(BinarySort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值: ②

Python进阶(六)----装饰器

Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ? 增加一些额外的新功能 封闭原则: ? 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包 ###普通版装饰器 import time def timmer(x): # x 接收的原函数的内存地址 def inner(): start_time=time.time() x() # 执行 原函数 print(f'执行效率{time.time()-start_time}'

oc语言学习之基础知识点介绍(五):OC进阶

一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点语法的语法: 对象.属性; 注意:这里的属性不需要加_ 对象.属性 = 值; 点语法的本质: 其实就是调用getter或者setter方法. 点语法注意事项: 1.在类的方法里面如果用self.age 这个是调用方法,self->_age 是直接调用成员变量. 2.千万记得不要在setter或者ge

Ruby操作MongoDB(进阶六)-索引Indexing

在本博文中,我们主要介绍数据库索引.主要包含创建索引,删除索引,列出索引 数据库驱动提供了在集合上创建,删除和查看索引的方法. 创建索引 创建索引的操作中,可以一次创建一个索引,也可以一次创建多个索引.在3.0及其以上版本的MongoDB数据库中,多个索引一起创建时是被平行创建出来的.在更早的版本中,多个索引是按照顺序创建的. 单个索引的创建,使用create_one方法 client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film'

【非凡程序员】 OC第六节课 (枚举,字典,结构体,NSRange,CG类型,NSnumber,空)

#import <Foundation/Foundation.h>#import "Article.h"#import "Person.h" int main(int argc, const char * argv[]) {    @autoreleasepool { //自动释放池 (半自动) //-------------------------枚举类---------------------------------//     NSArray *p

iOS开发-OC语言 (六)点语法和@property

点语法和@property 知识点 1.setter/getter函数 2.点语法 [email protected]语法和属性 ======================================== 一.setter和getter函数 1.setter和getter函数的作用 setter  方法:   修改对象的字段/实例变量 getter 方法:   读取对象的字段/实例变量 setter 方法: 可以带有多个参数,可以同时给多个变量赋值 getter方法: 不带参数,只能返回一

oc随笔六:字典

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //NSDictionary字典对象,字典主要特征是一对一的key和value组成 //不可变字典 //初始化字典,一半key值是字符串对象,控制用NSNull对象表示 NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"velue1

OC第六课

主要内容:Block(Block语法.Block使用.Block实现数组排序) 一.Block语法 Block:块语法.本质上是匿名函数(没有函数名称的函数),和函数指针很相似 函数回顾: 实现了某一功能的代码块的封装,(函数声明.函数定义.函数调用三步) 函数指针回顾: 函数指针(变量):存放函数地址(函数名)的指针变量 int ( *p ) ( int  x , int  y )  =  sum 函数指针类型:int ( * ) ( int x , int y) ,即指向两个整型参数,一个整

iOS开发之oc(六)--点语法

(一)点语法 1.利用点语法替代set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge:100]; int age = [stu age]; 点语法 stu.age = 100; int age = stu.age; 2.点语法的本质 >其实点语法的本质还是方法调用 >当使用点语法时,编译器会自动展开成相应的方法(编译器特性) 3.注意 死循环注意 - (void) setAge:(int)age { // 下面的代码会引发死循环