oc

从OC到Swift(5)- 动态性,KVC\KVO

倾然丶 夕夏残阳落幕 提交于 2019-11-30 00:42:11
dynamic 被@objc dynamic 修饰的内容会具有动态性,比如调用方法会走runtime那一套流程 class Dog: NSObject { @objc dynamic func test1() {} func test2() {} } var d = Dog() d.test1() d.test2() 对应汇编 KVC\KVO Swift支持KVC\KVO的条件 属性所在的类、监听器最终继承自NSObject 用@objc dynamic 修饰对应的属性 class Observer: NSObject { override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { print("observeValue", change?[.newKey] as Any) } } class Person: NSObject { @objc dynamic var age: Int = 0 var observer: Observer = Observer() override init() { super.init() self

从OC到Swift(6)- 关联对象

无人久伴 提交于 2019-11-30 00:42:05
关联对象(Associated Object) 在Swfit中,class依然可以使用关联对象 默认情况,extension不可以增加存储属性的 借助关联对象,可以实现类似extension为class增加存储属性的效果 class Person {} extension Person { private static var AGE_KEY: Void? var age: Int { get { (objc_getAssociatedObject(self, &Self.AGE_KEY) as? Int) ?? 0 } set { objc_setAssociatedObject(self, &Self>AGE_KEY, newValue, .OBJC_ASSOCIATION_ASSIGN) } } } var p = Person() print(p.age) // 0 p.age = 10 print(p.age) // 10 来源: https://blog.csdn.net/songzhuo1991/article/details/100982218

从OC到Swift(2)

拈花ヽ惹草 提交于 2019-11-30 00:40:21
OS程序的入口 在AppDelegate上面默认有一个@UIApplicationMain标记,这标识编译器自动生成入口代码(main函数代码),自动设置AppDelegate为APP的代理 也可以删掉@UIApplicationMain,自定义入口代码:新建一个main.swift文件 import UIKit class MyApplication: UIApplication {} UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(MyApplication.self), NSStringFromClass(AppDelegate.self)) Swift调用OC 新建一个桥接头文件,文件格式默认为:{targeName}-Bridging-Header.h 在纯swift代码中,创建一个OC类,会自动创建一个桥接头文件 在{targetName}-Bridging-Header.h 文件中 #import OC需要暴露被Swift的内容 Swift调用OC - @_silgen_name 如果C语言暴露给Swift的函数名跟Swift中的其他函数名冲突了 可以在Swift中使用@_silgen_name 修改C函数名 // C语言 int sum(int a, int

LeetCode 733: 图像渲染 flood-fill

独自空忆成欢 提交于 2019-11-29 22:36:07
题目: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。 An image is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535). 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。 Given a coordinate (sr, sc) representing the starting pixel (row and column) of the flood fill, and a pixel value newColor , "flood fill" the image. 为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。 To perform a "flood fill", consider the starting pixel, plus any pixels

OC语言特性

别说谁变了你拦得住时间么 提交于 2019-11-29 21:48:48
Category 你用分类都做了哪些事情? 声明私有方法 分解体积庞大的类文件 把Framework的私有方法公开 特点 在运行时决议,也就是在编译时并没有把Category中声明的内容添加到宿主类中,而是在运行的时候通过runtime将添加的方法添加到宿主类上面 可以为系统添加分类 分类中可以添加哪些内容? 实例方法 类方法 协议 属性 Category结构 struct category_t { const char *name; //分类名称 classref_t cls; //分类所属的宿主类 struct method_list_t *instanceMethods; //实例方法列表 struct method_list_t *classMethods; //类方法列表 struct protocol_list_t *protocols; //协议 struct property_list_t *instanceProperties; //实例属性列表 // Fields below this point are not always present on disk. struct property_list_t *_classProperties; method_list_t *methodsForMeta(bool isMeta) { if (isMeta)

OC之 block 本质

北慕城南 提交于 2019-11-29 17:57:44
实现方式 数据结构定义 block 的数据结构定义如下(图片来自 这里 ): 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *); }; struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor *descriptor; /* Imported variables. */}; isa 指针,所有对象都有该指针,用于实现对象相关的功能。 flags,用于按 bit 位表示一些 block 的附加信息,本文后面介绍 block copy 的实现代码可以看到对该变量的使用。 reserved,保留变量。 invoke,函数指针,指向具体的 block 实现的函数调用地址。 descriptor, 表示该 block 的附加描述信息,主要是 size 大小,以及 copy 和 dispose 函数的指针。 variables,capture 过来的变量,block

OC 学习笔记6 NSDictionary

你说的曾经没有我的故事 提交于 2019-11-29 16:37:07
OC 学习笔记6 NSDictionary 文章目录 OC 学习笔记6 NSDictionary 字典对象 字典的创建 1、创建只有单个键值对的字典 2、创建只有多个键值对的字典 判断键值对数目 运用count函数 查找/得到值(value),键(key) 1、通过单个键,查找单个值。 2、查找所有值(键)。 3、通过多个键,查找多个值。 字典对象 字典(dictionary)是一些元素的集合。每个元素有一个称作key 的域,不同元素的key 各不相同。有关字典的操作有:插入具有给定关键字值的元素、在字典中寻找具有给定关键字值的元素、删除具有给定关键字值的元素。 --百度百科 字典对象就是形如:*dict = @{@“Alice”: @“2341”, @“Beth”: @“9102”,@“Cecil”?“3258”}; 这样的元素集合。 它与数组不同之处是: 数组元素的存储是连续的; 而字典的存储是分散的。 字典的创建 1、创建只有单个键值对的字典 NSDictionary * a = [ NSDictionary dictionaryWithObject : @ "value1" forKey : @ "key1" ] ; NSLog ( @ "%@" , a ) ; 输出结果为: key1 = value1 2、创建只有多个键值对的字典 //通过数组对象来创建字典

oc基础-set和get方法的使用

我的未来我决定 提交于 2019-11-29 11:42:11
#import <Foundation.Foundation.h> @interface Student : NSObject { int _age; char *_name; } //声明set方法 - (void) setAge: (int)age; - (void) setName: (char *) name; //声明get方法 - (int)age; - (char *) name; @end @implementation Student //实现set方法 - (void) setAge: (int)age { if(age<18) { age=20; } _age=age; } - (void) setName: (char *) name { _name=name; } //实现get方法 - (int)age { return _age; } - (char *) name { return _name; } @end int main() { Student *stu=[Student new]; //调用set方法赋值 [stu setAge:20]; //调用get方法取值 NSLog(@"学生的年龄是:%d",[stu age]); } 1.set方法作用:提供一个方法给外界设置成员变量的值,有一定的安全性 set方法的命名规范:方法法必须以set开头

排序算法(OC实现)

▼魔方 西西 提交于 2019-11-29 03:17:40
排序的分类: 交换类排序:冒泡排序、快速排序 插入类排序:直接插入排序、希尔排序 选择类排序:简单选择排序、堆排序 交换类排序 冒泡排序 时间复杂度:最好(有序情况下)O(n),平均(逆序情况下)O(n^2) 空间复杂度:O(1) 算法思想:(从小到大,从前往后) 第一个记录和第二个记录比较,如果第一个大,则二者交换,否则不交换;然后第二个记录和第三个记录比较,如果第二大,则二者交换,否则不交换…… 代码:(这里是创建了NSMutableArray的分类,下同) #import "NSMutableArray+Sort.h" @implementation NSMutableArray ( Sort ) /** 冒泡排序 * isAsc YES 表示升序(下同) */ - ( void )sortedArrayWithBubleASC:( BOOL )isAsc{ NSInteger len = self .count ; for ( NSInteger i=len- 1 ; i> 0 ; --i) { BOOL flag = NO ; for ( NSInteger j = 0 ; j < i; ++j) { if ((isAsc && self [j] > self [j+ 1 ]) || (!isAsc && self [j] < self [j+ 1 ])) { [

RedisTemplate与zset

天大地大妈咪最大 提交于 2019-11-29 00:06:37
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。 下面来对这5种数据结构类型作简单的介绍: 结构类型 结构存储的值 结构的读写能力 String 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement) List 一个链表,链表上的每个节点都包含了一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素 Set 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同 添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里卖弄随机获取元素 Hash 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对 Zset 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 Redis 5种数据结构的概念大致介绍到这边