iOS
史蒂芬-周
这个作者很懒,什么都没留下…
展开
-
fastlane 打包增加版本号报错
fastlane的使用原创 2022-06-12 21:52:23 · 668 阅读 · 0 评论 -
记一次iOS与H5交互导致上线差点延迟的问题
临时测试到的iOS版本低版本:iOS14.3及一下高版本:iOS14.7及以上我们这里用了- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{}可以用来拦截H5界面点击事件的Url,原创 2021-12-26 19:03:49 · 1160 阅读 · 0 评论 -
XB_多线程(安全)
1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源。 比如多个线程访问同一个对象、同一个变量、同一个文件。 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。 使用线程同步技术(同步,就是协同步调,按照预定的先后次序进行),常见的线程同步技术是:加锁 线程同步方案:OSSpinLock 、os_unfair_lock 、pthread_mutex 、dispatch_...原创 2019-12-19 18:23:28 · 350 阅读 · 0 评论 -
XB_多线程(1)
1.下面代码打印什么?- (void)test2{ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSLog(@"1"); // 这句代码的本质是往Runloop中添加定时器,注意:已经拿到RunLoop,并添加定...原创 2019-12-19 15:49:42 · 226 阅读 · 0 评论 -
XB_RunLoop(应用)
1.控制线程生命周期(线程保活) [[MJThread alloc] initWithBlock:^{ NSLog(@"%@----begin----", [NSThread currentThread]); // 往RunLoop里面添加Source\Timer\Observer [[NSRunLoop currentRun...原创 2019-12-19 15:15:24 · 306 阅读 · 0 评论 -
XB_RunLoop
1.RunLoop对象iOS中有两套API来访问和使用RunLoopCoreFoundation框架:CFRunLoopRef,是开源的Foundation框架:NSRunLoop,基于CFRunLoopRef的一层OC包装2.获取RunLoop对象[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象CFRunLoopGetCur...原创 2019-12-19 14:07:49 · 228 阅读 · 0 评论 -
XB_runtime(应用)
例子: 1.可以获取成员变量信息,也可以设置和获取成员变量的值 可以用来对模型赋值json解析的数据,也可以通过KVC对未公开的成员变量进行修改 self.textField.placeholder = @"请输入用户名"; [self.textField setValue:[UIColor redColor] forKeyPath:@"_...原创 2019-12-18 17:43:11 · 289 阅读 · 0 评论 -
XB_runtime(消息发送)
前言:前言1.方法的底层结构struct method_t{ SEL name; //函数名 const char *types;//编码(返回值类型、参数类型) IMP imp;//指向函数的指针(函数地址)}SEL代表函数名,一般叫做选择器,底层结构跟char *类似 可以通过@selector() 合sel_registerName()获...原创 2019-12-18 17:12:39 · 318 阅读 · 0 评论 -
Class中的isa指针本质
1.iOS存储优化BOOL类型占1字节,如何将多个BOOL类型数据存储在一个字节中?可以用一字节的每一位表示一个BOOL类型实现原理#import "Person.h"#define TallMask (1<<0) //表示1左移一位:0b 0000 0001#define RichMask (1<<1) //表示1左移一位:0b 0000 0010#d...原创 2019-12-13 15:51:15 · 322 阅读 · 0 评论 -
XB_block(3)
1.__block的内存管理我们已经知道,__block修饰符会把auto变量包装成一个对象1.当block在栈上时,并不会对__block变量产生强引用 2.当block被copy到堆时,会调用block内部的copy函数,copy函数内部会调用_Block_object_assign函数, _Block_object_assign函数会对__block变量形成强引用(retain),...原创 2019-12-09 17:51:22 · 229 阅读 · 0 评论 -
XB_block(2)
1.block的copy在ARC环境下,编译器会在以下情况下自动将栈上的block复制到堆上block作为函数的返回值typedef void (^MJBlock)(void);MJBlock myblock(int age){ return ^{ NSLog(@"---------%d",age); };}int main(int argc,...原创 2019-12-09 12:36:35 · 296 阅读 · 0 评论 -
XB_block(1)
1.block的本质block本质上是一个OC对象,内部封装了函数调用和函数调用环境,底层结构如下图,第一位是__block_impl,第二位是__main_block_desc_0,后边是捕获的变量。其中__block_impl中存有一个FuncPtr的函数指针,block通过该指针调用了内部的函数。注意:当调用函数的时候理论上应该是block-->impl.FuncPtr这样...原创 2019-12-08 18:35:05 · 273 阅读 · 0 评论 -
XB_Category(3)
默认情况下,因为分类底层结构只有属性列表和协议列表方法列表等,但是偏偏没有成员变量列表,所以分类不能添加成员变量,但是可以通过关联对象来间接实现,但并不是这个对象真正意义上的成员变量。虽然分类的属性自动生成了set和get方法的声明,但是并没有生成set和get方法的实现。1.添加关联对象void objc_setAssociatedObject(id object, const voi...原创 2019-12-08 16:20:34 · 257 阅读 · 0 评论 -
XB_Category(2)
1.+(void)loadload方法在runtime加载类、分类的时候调用,不管是否使用了这个类,都会调用load方法,并且在程序运行过程中只调用一次,1>load方法也会随着Category合并到元类中的方法列表中,所以如果手动调用load方法也是遵循objc_msgSend消息发送机制的比如[NSPersonload],如果没有实现,会调用父类的load方法实现。2&...原创 2019-12-06 18:27:23 · 275 阅读 · 0 评论 -
XB_Category(1)
首先分类的底层结构如下,也有类名,比如(Person)、对象方法列表、类对象方法列表、协议列表struct _class_t { struct _class_t *isa; struct _class_t *superclass; void *cache; void *vtable; struct _class_ro_t *ro;};//分类的结构struct _cate...原创 2019-12-06 16:45:11 · 222 阅读 · 0 评论 -
XB_KVO与KVC
1.KVOKVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变KVO本质是利用RuntimeAPI动态生成一个子类,并且让这个instance对象的isa指向这个全新的子类,当修改instance对象的属性时,会调用Foundtion的_NSSetXXXValueAndNotify函数,该函数包含三部分willChangeValueF...原创 2019-12-05 18:04:21 · 607 阅读 · 0 评论 -
XB_类对象的分类(2)
1.isa指针与class对象的superclass指针的指向/*------------isa指针--------------------------------------*/1>instance的isa指针指向class当调用对象方法的时候,通过instance的isa指针找到class,然后在class中找到对象方法的实现进行调用2>class的isa指针指...原创 2019-12-05 15:00:27 · 249 阅读 · 0 评论 -
XB_对象的分类(1)
对象分实例对象、类对象、元类对象三种类型1.实例对象(instance对象) NSObject *obj = [[NSObject alloc]init];是通过类alloc出来的对象,里边存储的有isa指针和成员变量2.类对象(class对象) NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 ...原创 2019-12-05 10:53:40 · 352 阅读 · 0 评论 -
XB_OC对象的本质
1.对象简介OC对象是基于C/C++的结构体实现的,可以用以下命令把OC文件转换成CPP文件,这样可以看到OC对象的结构体样式xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件以下都是基于64位环境//OC样式的@interface NSObject{//实际上隐藏着一...原创 2019-12-04 17:05:47 · 250 阅读 · 0 评论 -
__attribute__的一些使用
1.objc_subclassing_restricted#import <UIKit/UIKit.h>#import <objc/runtime.h>NS_ASSUME_NONNULL_BEGIN__attribute__((objc_subclassing_restricted))//禁止该类被继承@interface AAA : UIView-...原创 2019-10-14 09:34:35 · 1256 阅读 · 0 评论 -
Swift闭包
func closesure{///1. let b = {print("最简单闭包")} b() ///2. let countNum = {(num1:Int,num2:Int) -> Int in return num1+num2 } let count = countNum(2,6) ...原创 2018-11-02 20:06:36 · 406 阅读 · 0 评论 -
CGContextAddArcToPoint和CGContextAddArc
CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, // 圆心(x,y) CGFloat radius, // 半径 CGFloat startAngle, CGFloat endAngle, // 开始、结束弧度 int clockwise // 绘制方向,0:顺时针; 1:逆时针) 中心点右侧: 弧度为 0中心点下方: 弧度为 M_...转载 2018-05-02 13:51:23 · 182 阅读 · 0 评论 -
ios weak实现原理用的表伪代码
1.伪代码模拟weak用到的主要表struct weak_referrer_t{ int weakPtr;//瞎写的不做参考};//hash表struct weak_entry_t{ int index; //存储弱引用该对象的指针的指针的数组 weak_referrer_t inline_referrers[3]; id referent;...原创 2019-08-16 17:57:41 · 279 阅读 · 0 评论 -
iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用
理解这个概念之前,先抛出一个问题问题描述:假设现在系统有两个空闲资源可以被利用,但同一时间却有三个线程要进行访问,这种情况下,该如何处理呢?或者我们要下载很多图片,并发异步进行,每个下载都会开辟一个新线程,可是我们又担心太多线程肯定cpu吃不消,那么我们这里也可以用信号量控制一下最大开辟线程数。 定义: 1、信号量:就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号...转载 2018-04-09 17:57:37 · 581 阅读 · 0 评论 -
atomic的一些理解
在多线程中,atomic只保证getter、setter方法安全,并不保证其它操作,例如字符串拼接,数组移除元素等-(void)setMstrOrigin:(NSString *)mstrOrigin{ @synchronized(self){ if(_mstrOrigin != mstrOrigin){ [_mstrOrigin releas...原创 2018-04-06 16:39:41 · 740 阅读 · 2 评论 -
@synchronized和NSLock产生死锁场景
/** A锁 */ static NSString* A = @"A"; /** B锁 */ static NSString* B = @"B"; dispatch_async(queue, ^{ // NSLog(@"%@",[self sourceOut]) ; @synchronized(A){ ...原创 2018-04-06 16:40:11 · 2180 阅读 · 0 评论 -
dispatch_group嵌套异步函数的正确使用
举个栗子:异步请求A图片和B图片和C图片,在最后合成ABC图-(void)group{ dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),...原创 2018-04-06 16:40:26 · 1727 阅读 · 0 评论 -
UItextField的UITextEffectsWindow
当使用UItextField的时候,调用之前[[UIApplication sharedApplication] windows]只有一个主window,调用之后会出现UITextEffectsWindow和UIRemoteKeyboardWindow,共3个window。需要给自定义键盘添加半透明背景图,把该背景图添加到window上,应使用[[[UIApplication sharedAp...原创 2018-07-23 16:41:13 · 2588 阅读 · 0 评论 -
UITextField自定义inputView注意事项
自定义inputView的时候使用UIPickerView,自定义高度的时候会出现inputAccessoryView与inputView坐标错乱如图: 解决方式: UIView *inputView = [[UIView alloc]initWithFrame:self.pickerView.bounds]; [inputView addSubview:self.pic...原创 2018-07-18 17:24:38 · 3108 阅读 · 0 评论 -
根据date获取week
//根据时间戳获取周几- (NSString *)getWeekFromDate:(NSDate *)date{ NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; ...原创 2018-10-22 10:47:11 · 1544 阅读 · 0 评论 -
Swift 枚举的模式匹配
关联值设置枚举enum Trade { case Buy(stock: String, amount: Int) case Sell(stock: String, amount: Int)}模式匹配访问let trade = Trade.Buy(stock: "APPL", amount: 500)//值绑定模式switch trade { ...原创 2018-11-05 09:41:45 · 406 阅读 · 0 评论 -
Swift中协议与泛型的应用
1.方法的泛型 //泛型约束(冒号后边跟class或者协议,传入的参数someT和someU必须是遵循该协议或类---(NAArray类,Comparable协议)) func someFunction<T:NSArray, U:Comparable>(someT: T, someU: U) { // 这里是泛型函数的函数体部分 } ...原创 2018-11-05 09:41:21 · 862 阅读 · 0 评论 -
UItextField的UIControlEventEditingChanged失效
当给UITextField使用选择器的时候,非键盘输入,比如:UIDatePicker,会导致UIControlEventEditingChanged失效这时应该在选择器改变UItextField的时候使用 textField.text = @“”; [textField insertText:@“new text”];来改变值,UIControlEventEditingChang...原创 2018-11-16 17:37:44 · 1514 阅读 · 0 评论 -
导出沙盒文件
真机下device and simulators模拟器直接复制打印的路径,mac上前往文件夹就行原创 2018-12-04 11:10:09 · 1509 阅读 · 0 评论 -
修改UItextField的光标高度
#import "IGResultValueTextField.h"@implementation IGResultValueTextField-(CGRect)caretRectForPosition:(UITextPosition *)position{ CGRect originalRect = [super caretRectForPosition:position];...原创 2018-11-27 11:05:12 · 857 阅读 · 0 评论 -
浅析class 、superclass、isMemberOfClass、isKindOfClass
经典图抛出问题 BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL res3 = [(id)[Student ...原创 2019-08-19 14:38:01 · 317 阅读 · 0 评论 -
dispatch_after与performSelector延迟区别
1.在主线程中-(void)operationUse{ dispatch_queue_t serialQueue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0*NSE...原创 2018-04-07 17:27:11 · 1302 阅读 · 0 评论