iOS开发
Batac_
中国北方小镇的田园村落
展开
-
Swift-运算符重载
目录1. 全局运算符重载2. 局部重载3. 结构体遵守Equatable 协议4. 枚举 遵守Equatable协议5. 遵守Comparable协议6. 自定义运算符1. 全局运算符重载struct Point { var x = 0, y = 0}// 全局的重载func + (p1: Point, p2: Point) -> Point{ Point(x: p1.x + p2.x, y: p1.y + p2.y)}var p1..原创 2021-05-03 11:01:59 · 894 阅读 · 0 评论 -
Swift-属性
属性类型 存储属性 在类或者结构体中可以有储存属性; 属性中可以有属性观察器; 存储属性是存储到结构体或者类结构中的; 枚举中不能有存储属性, 因为枚举变量只能存储case...; 计算属性 计算属性的本质是生成对应的setter方法和getter方法; 计算属性中不能有属性观察器; 计算属性不存在成员变量, 存储在结构体或者类的结构中; 在类和结构体中可以有存储属性; 类型属性 类型属性全局只能有一份, 使用static修饰; 类型属性可以在类、结构体、枚举中...原创 2021-05-01 14:09:33 · 389 阅读 · 0 评论 -
Swift-闭包的简单使用
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]参数是一个闭包使用如下:let array = ["Objective-C", "Swift", "HTML", "CSS", "JavaScript"]// 当闭包作为最后一个参数的时候, 可以省略小括号 '()'array.map(){ value -> String in return valu.原创 2021-04-30 14:52:51 · 344 阅读 · 0 评论 -
Swift- 基础语法
基本命令:// Swift playground支持markdown语法// 开启路径: Editor -> show rendered markdown//: # 一级标题//: ## 二级标题//: ### 三级标题//: [上一页](@previous)效果如下:常量 使用let修饰/** *常量定义: let修饰 * 常量的值不要求在编译时期确定, 但使用之前必须赋值1次 * 常量声明时必须注明类型, 必须要在使用...原创 2021-04-11 20:54:46 · 261 阅读 · 0 评论 -
多线程实战(线程组+信号量+操作队列)
生产问题:1. 上传100个psd2. 每个psd内 100个图3. 需要知道上传完每个psd 和 所有psd的时思路: 1. n个psd之间使用串行处理; 2. psd中的n个图片使用并发处理, 使用信号量控制并发数; 3. 图片上传内部又有3个异网络请求, 使用线程组实现穿透同步;psd实现类://头文件@interface PSDModel : NSObject//psd开始时间@property (nonatomic, strong) NSSt原创 2021-01-26 11:57:15 · 264 阅读 · 0 评论 -
数组下标越界拦截(OC)
#import "NSArray+LXZArray.h"#import <objc/runtime.h>/** 在iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇,一个NSArray的实现可能由多个类组成。 所以如果想对NSArray进行Swizzling,必须获取到其“真身”进行Swizzling,直接对NSArray进行操作是无效的。 下面列举了NSArray和NSDictionary本类的类名,可以通过Runtime函数取出本类。 N.原创 2021-01-15 14:16:28 · 651 阅读 · 1 评论 -
OC底层performSelector:@selector(test) withObject:nil afterDelay:
-(void)test{ NSLog(@"2");}-(void)test2{ NSLog(@"3");}- (void)viewDidLoad { [super viewDidLoad]; //并发队列 dispatch_queue_t queue = dispatch_queue_create("batac.com", DISPATCH_QUEUE_CONCURRENT); //异步处理任务 dispatch_async(q.原创 2020-12-21 19:34:40 · 597 阅读 · 0 评论 -
原创 OC底层 - runtime 结构体+位域
使用结构体位域:#import "Student.h"@interface Student(){ //一个字节 可以表示8个BOOL变量 /** 位域 */ struct{ char tial : 1; char rich : 1; char handsome : 1; } _tailRichHandsome;} @end@implementation Student-(原创 2020-12-07 14:29:03 · 182 阅读 · 0 评论 -
OC底层 - runtime 一个char变量按位保存多个BOOL变量值
在arm64之后, 优化了isa指针实现, 使用共同体实现isa, 可以节省内存:以下使用一个char变量保存多个BOOL变量的值,实现代码:///左移操作#define LPTail (1<<0)#define LPRich (1<<1)#define LPHandsome (1<<2)//// Person.m// demo007_runtime_isa_共用体//// Created by Batac on 2020/12/7..原创 2020-12-07 13:58:47 · 234 阅读 · 0 评论 -
OC底层 - block内修改变量
block的捕获问题block内部修改变量问题讲一下以上两个问题:对于捕获问题, 只有局部变量才能被捕获, 全局变量不需要捕获,直接拿着使用, 但是有一点, 当block在栈中时, block是不能捕获对象型变量, 直接拿着使用, 只有在堆中的block才能捕获对象型变量;对于block内部修改问题, 因为变量捕获有两种, 一种是值捕获, 一种是地址捕获, 对于这两种捕获, 第一种是不允许在block中修改其值, 第二种是不允许在block中修改其地址, 但是可以修改其值;对于对象型变.原创 2020-12-02 18:07:06 · 416 阅读 · 0 评论 -
OC底层 - block放入堆中
之前已经讲过, block有三个类型 NSStackBlock 、NSMallocBlock 、 NSGlobalBlockNSStackBlock是放在栈中, 访问了auto变量; NSGlobalBlock是放在数据区中, 没有访问auto变量; NSMallocBlock是放在堆中, 是NSStackBlock类型的block调用了copy方法后变换过来的;什么样的条件才会被放入堆中?block作为函数返回值时; 将block赋值给__strong指针时; block作为Cocoa原创 2020-12-02 10:31:36 · 167 阅读 · 0 评论 -
OC底层 - block类型
ARC无效block继承自NSBlock, NSBlock继承自NSObject;分为三种: NSGlobalBlock 放在数据区 NSMallocBLock 放在堆内存中 NSStackBlock 放在栈内存中怎么样创建三种block?如下图: 没有调用auto变量时, 会创建出NSGlobalBlock类型, 放在数据区中;-(void)test{ int age = 10; void(^block1)(...原创 2020-12-01 16:43:51 · 209 阅读 · 0 评论 -
OC底层 - block捕获变量
block是oc语言的一种代码块, 底层实现为oc对象, 代码块封装在一个函数中, 函数作为该oc对象的一个变量, 调用时, 直接调用该函数;什么情况下block会捕获变量呢?局部变量(自动变量)如果block中使用了方法中的局部变量, 如下:-(void)test{ int age = 10; void(^block1)(void) ^{ NSLog(@"%ld",age); };}因为局部变量(自动变量)在test方法结束的时候会被自动原创 2020-12-01 14:25:58 · 386 阅读 · 0 评论 -
OC大话ARC与对象的生命周期
前提是ARC有效函数在返回值得时候, 会将其内部变量全部清空释放; 由alloc/new/copu/mutableCopy生成的对象自己持有, 对象默认修饰符为__strong; 除了2中所生成的对象, 其他都是非自己生成但是自己持有的对象; 对象在没有明确指定修饰符时, 默认为__strong;-(void)test { id obj1 = [[NSObject alloc] init]; id obj2 = [NSMutableArray array]; .原创 2020-11-26 22:06:11 · 382 阅读 · 2 评论 -
OC底层分类 - +load加载顺序
什么时候加载load?+load方法会在runtime时加载类与分类信息, 这时候加载load方法; 类与分类的+load方法在程序运行过程中只会加载一次; 现价在类的+load方法, 再加载分类的+load; 类间加载+load的顺序和编译顺序有关, 先编译先加载; 先调用父类的+load, 再调用子类的+load; 分类之间部分父类子类, +load加载之和编译顺序有关, 先编译先加载;...原创 2020-11-25 18:45:55 · 559 阅读 · 0 评论 -
程序员的自我修养-堆与栈
1.栈内存、堆内存布局从上到下由高地址到低地址, 最上边分配给内核使用,接着是栈内存, 动态库使用内存, 堆内存, 其他内存栈内存是向下扩容, 增加元素, 则栈顶地址降低, 推出元素, 则栈顶地址升高;堆内存是向上扩容;栈内存特点: 栈上的数据在函数返回后就会自动释放;堆内存特点: 程序主动放弃之前都会保持不变;2.函数入栈过程void f(int y){ printf("y=%d", y);} int main(){ int x = 1; ..原创 2020-11-21 11:59:44 · 214 阅读 · 1 评论 -
OC底层原理-内存对其
操作系统在优化数据处理的时候, 会将内存对其, 根据不同的操作系统, 对其长度也不同, 比如macos中对其的方式为16的倍数.在object-c中, oc对象的底层实现为结构体, 结构体也存在内存对其, 而结构体的内存占用大小等于结构体内所有变量内存占用大小之和, 另一条规则为, 结构体的总大小为, 最大变量内存大小的倍数;...原创 2020-11-20 16:03:58 · 200 阅读 · 0 评论 -
试玩CoreML
第一步当然是看文档:https://developer.apple.com/machine-learning/models/包含了图像分类, 图像分割, 对象检测等模型, 每一个案例都有代码实例与训练好的模型, 可以根据demo直接调试;使用YOLOv3在真机上进行对象检测, 效果如图:因为种类不够多, 只能检测出一定的物体, 但此时已经很大了, 显然, 移动端的app是太大了, 如果网速更得上, 放在服务端的效果也许会更好(5G用在个人太浪费...)代码下载:https://de.原创 2020-10-19 17:21:14 · 143 阅读 · 0 评论 -
SwfitUI之Published
// let objectWillChange = PassthroughSubject<Void, Never>()// var brain: CalculatorBrain = .left("0") {// willSet { objectWillChange.send() }// } /** 1.@Publi...原创 2020-01-07 15:33:58 · 476 阅读 · 0 评论 -
SwiftUI的ObservableObject与EnvironmentObject应用
根据适用范围和存储状态的复杂度的不同,需要选取合适的方案。@State 和 @Binding 提供 View 内部的状态存储,它们应该是被标记为 private 的简单值类型,仅在内部使用。ObservableObject 和 @ObservedObject 则针对跨越 View 层级的状态共享,它可以处理更复杂的数据类型,其引用类型的特点,也让我们需要在数据变化时通过某种手段向外发送通知 (...原创 2020-01-07 15:30:22 · 1505 阅读 · 0 评论 -
iOS之多线程(GCD)
原创 2019-06-08 17:33:43 · 140 阅读 · 0 评论 -
自动开启闪光灯
1.如果是自己设置摄像头:// 1.获取硬件设备 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // 2.创建输入流 AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc]...原创 2019-04-04 14:12:37 · 701 阅读 · 0 评论 -
%s与%c
字符串是以\0结尾,在输出中使用%s接受输出字符串,%s的作用是从字符串的第一个字符的地址开始知道遇到\0结束#include <stdio.h> int main(){ char *buf="ABCDEFG"; printf("buf=%c\n”,*(buf+2)); //buf[2]='F'; printf("end!\n"); } 因为指针接收字符串时,字符串是放在内存中原创 2016-04-17 13:01:16 · 2512 阅读 · 0 评论 -
@property和@synthesize
@property和@synthesize两个都是编译器指令,编译器指令是用来告诉编译器要做什么.@property的历史存在两个阶段:第一个阶段是Xcode4.X之前和之后.在之前,@property只能生成setter/getter方法的声明:格式: @property int age;会生成setter/getter方法的声明: -(void)setAge:原创 2016-01-26 12:59:22 · 412 阅读 · 0 评论 -
setter方法和getter方法
setter方法和getter方法: OC是一门面向对象的语言,面向对象的语言有三大特性,就是封装性,继承性和多态性.类的数据与功能的封装,数据就是成员变量,功能就是类方法或者对象方法,对数据的封装,也就是对成员变量的封装,封装就是把数据隐藏起来,只能用此类的方法才可以读取或者设置数据,不可被外部任意修改是面向对象设计本质,降低了数据被误用的可能性,提高了代码的灵活性.封装原创 2016-01-26 12:58:30 · 4986 阅读 · 0 评论 -
OC中id数据类型的使用
动态数据类型id:数据类型常用的有:1.int整型;2.double双精度型;3.float单精度型;4.char字符类型;等......数据类型的用途是什么呢?在计算机语言中,数据类型有三种用途,1.定义变量;2.作为函数的参数;3.作为函数的返回值.默认情况下,所有的数据类型都是静态数据类型.默认数据类型的特点如下:在编译时就知道变量的类原创 2016-01-25 00:22:16 · 4600 阅读 · 0 评论 -
%s与%c
字符串是以\0结尾,在输出中使用%s接受输出字符串,%s的作用是从字符串的第一个字符的地址开始知道遇到\0结束#include int main(){ char *buf="ABCDEFG"; printf("buf=%c\n”,*(buf+2)); //buf[2]='F'; printf("end!\n"); } 因为指针接收字符串时,字原创 2016-01-19 22:51:08 · 413 阅读 · 0 评论 -
指针数组和数组指针
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针:a pointer to an array,即指向数组的指针还要注意的是他们用法的区别,下面举例说明。int* a[4] 指针数组 表示:数组a中的元素都为int型指针转载 2016-01-16 12:54:45 · 349 阅读 · 0 评论 -
经典C语言程序设计100例
怎样学习C语言 很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要,如果不懂C语言,你想写底层程序这几乎听起来很可笑,不懂C语言,你想写出优秀高效的程序,这简直就是天方夜谭。为什么C语言如此重要呢?转载 2016-01-10 13:20:41 · 2674 阅读 · 0 评论 -
iOS之调用系统自带语音功能
#include #include int main() {// 帅哥猜出美女的年龄,// 进行判断猜出的年龄与美女的年龄是否相同,// 有n次机会猜 int age = 0; int girl =arc4random_uniform(20);// printf("%i",g原创 2016-01-06 20:28:20 · 843 阅读 · 0 评论 -
将seetaFace2导入iOS项目中(人脸识别)
std::vector<SeetaFaceInfo> faces = engine.DetectFaces( image_data ); printf("faces:%d",faces.size()); if(faces.size() > 0){ printf("检测到人脸\n"); for( SeetaFaceInfo &face : faces ) { .原创 2020-09-24 09:34:55 · 418 阅读 · 0 评论 -
关于xcode11版本无法上传包,一直停留在验证的问题
最近下载xcode11上传包的时候一直失败,找了很多资料,终于解决了,在此记录与大家分享。苹果最后上传包是通过程序iTMSTransporter来上传的,该程序存在于Application Loader程序文件目录下,但最新版本的xcode11已经移除了Application Loader。然后,我发现最新的Xcode 在这里位于iTMSTransporter:(先下载Transpor...原创 2020-03-13 21:33:03 · 652 阅读 · 0 评论 -
iOS线上证书过期处理办法
1、生产证书过期处理2、推送证书过期处理1)生产证书过期,不会影响线上的应用的安装。但开发者账号过期会干扰安装,应用商店会下架app, 知道续费成功后,大概24小时内恢复可下载。2)证书过期后,发布证书、测试证书都会被苹果删除。我们只需要找到CSR根证书,重新生成新的发布、测试证书。如果你想在证书过期前处理,则需要先Revoke 发布、测试证书,然后重新生成新的发布、测试证书。3)生...原创 2020-01-02 09:29:03 · 3966 阅读 · 0 评论 -
UITextField 禁用复制粘贴功能
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { // 禁用粘贴功能 if (action == @selector(paste:)) return NO; // 禁用选择功能 if (action == @selector...原创 2019-12-09 10:40:02 · 288 阅读 · 0 评论 -
iOS 13适配:设置UITabBarItem上title颜色
适配iOS 13发现设置UITabBarItem的颜色,未选中状态下无效为默认颜色,选中状态下有效,但是push后再返回,tabBarItem选中颜色变为系统蓝色,修改后如下:// 适配iOS13导致的bugif (@available(iOS 13.0, *)) { // iOS 13以上 self.tabBar.tintColor = RGB_HEX(0xfb5400)...原创 2019-12-09 10:38:57 · 582 阅读 · 0 评论 -
ios 通过代码调节屏幕亮度
方法:[[UIScreen mainScreen] setBrightness: value];value:value就是屏幕的亮度值 这个值介于0和1之间另外 这个方法 会即时刷新 无需手动刷新 但这个方法是调整整个手机界面的亮度的 并不仅仅是某个app的亮度 也就是说这个亮度就是在你完全退出这个app后还是会保持的 所以当我们不需要这个亮度继续保持的时候 我们需要在ap...原创 2019-08-08 17:20:30 · 512 阅读 · 0 评论 -
SQLite数据库函数基本使用
1.打开数据库int sqlite3_open( const char *filename, // 数据库的文件路径 sqlite3 **ppDb // 数据库实例);2.执行任何SQL语句int sqlite3_exec( sqlite3*, // 一个打开的数据库实例 c原创 2016-05-22 20:05:09 · 494 阅读 · 0 评论 -
SQLite数据库基本语法
/*简单约束*/CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER);CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NUL原创 2016-05-22 20:03:36 · 475 阅读 · 0 评论 -
自定义点击状态栏返回
点击屏幕最上方状态栏(status)时,如果当前是tableview或者是可以滚动的控件,就可以滚动到最上方的位置;#import "LZPStatuesClickWindow.h"//定义一个全局变量//整个程序的生命周期都存在;UIWindow * _statueWindow;@interface LZPStatuesClickWindow ()@end@implementation原创 2016-05-09 16:33:41 · 1162 阅读 · 2 评论 -
静态库(OC)
什么是库?库是程序代码的集合,是共享程序代码的一种方式根据源代码的公开情况,库可以分为2种类型开源库公开源代码,能看到具体实现比如SDWebImage、AFNetworking闭源库不公开源代码,是经过编译后的二进制文件,看不到具体实现主要分为:静态库、动态库静态库和动态库的存在形式 静态库:.a 和 .framework动态库:.dylib 和 .framework静态库和动态库原创 2016-05-31 21:08:52 · 645 阅读 · 0 评论