- 博客(91)
- 资源 (3)
- 收藏
- 关注

原创 2020最新苹果企业级开发者账号续费流程
“化繁为简,走上征途。”图来源:(百度)苹果企业级开发者账号:Apple Developer Enterprise Program费用:299$续费频次:1次/年使用范围:仅企业内部使用苹果企业级开发账号对于很多公司属于紧缺资源了,相比于需要通过苹果个人或者公司级开发者账号发布到App Store的app而言,它的优势太明显了,因为它可以...
2020-08-02 09:04:55
16508
10
原创 block循环引用
typedef void(^GHBlock)(void);底层源码typedef void(*GHBlock)(void);struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; GHPerson *person; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, GHPerso
2021-01-20 16:31:03
223
原创 block的内存管理
MRC环境下:使用__block会使得底层将变量或者下面的person对象先包装成一个对象。源码typedef void(^GHBlock)(void);__block GHPerson *person = [[GHPerson alloc]init]; GHBlock block = ^{ NSLog(@"%p",person); };
2021-01-19 11:33:52
251
原创 block修改外部变量方式及底层原理
方式一:使用static修饰外部变量**NSGlobalBlock**修改了变量类型,静态变量会一直呆在内存中 typedef void(^GHBlock)(void); static int age = 10; GHBlock block = ^{ age = 100; NSLog(@"age is %d",age); }; block(); NS
2021-01-18 15:09:03
352
原创 iOS 判断变量或者对象存储位置
int age = 10;int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... int a = 100; NSLog(@"数据段:age %p",&age); //数据段:age 0x100008208 NSLog(@"栈:a %p",&a); //栈:a 0x7ffeefbff41c
2021-01-15 14:25:57
363
原创 block的几种类型(__NSGlobalBlock__,__NSStackBlock__,__NSMallocBlock__)
void(^block)(void) = ^{ NSLog(@"Hello"); }; NSLog(@"%@",[block class]); //__NSGlobalBlock__ NSLog(@"%@",[[block class] superclass]); //NSBlock NSLog(@"%@",[[[block class] superclass] superclass]);//NSObject
2021-01-15 10:23:16
399
1
原创 block变量捕获《一》
代码如下,我们先看一个问题,这种情况下,变量会不会被block捕获。#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface GHPerson : NSObject@property (nonatomic,copy) NSString *name;- (void)test;- (instancetype)initWithName:(NSString *)name;@endNS_ASSUME_
2021-01-14 17:46:39
136
原创 程序员可以通过什么方式赚钱?
程序员的赚钱方式很多,这里我主要通过下面两个不同角色简单介绍一下:上班族上班族的工资结构主要分两个方面:工资。这个工资自然就是公司发放的工资了。总包(部分公司会有总包25万,30万这种)也好加上年终奖(类似25*16)也好,都算是工资里面了。副业。副业这种就和下面要说的自由职业者做的内容区别不大了。副业来源就丰富了,比如:写写公众号,写写博客,付费专栏,兼职讲师,程序员兼职平台接私单等等。自由职业者我身边就有朋友做自由职业者工作的,所谓自由职业者就是时间比较自由,可以每天睡到自然醒,也可以通宵.
2020-12-13 10:11:11
1259
2
原创 iOS dealloc的底层调用实现
#if LP64static inline uint32_t ptr_hash(uint64_t key){key ^= key >> 4;key *= 0x8a970be7488fda55;key ^= __builtin_bswap64(key);return (uint32_t)key;}#elsestatic inline uint32_t ptr_hash(uint32_t key){key ^= key >> 4;key *= 0x5052acdb
2020-12-08 17:04:39
474
原创 苹果企业级开发者账号使用规范(同样适用于个人及公司级开发者账号)
在我的iOS开发生涯中,曾做过这样几件事情:分别申请成功过:苹果个人开发者账号;苹果公司级开发者账号;苹果企业级开发者账号;苹果商务管理分发账号(ABM,苹果后期将主推的一款账号,旨在替代企业级开发者账号);其中经历申诉账号的是苹果企业级开发者账号,做iOS开发的都应该明白,苹果企业级开发者账号意味着什么吧,而且这两年申请已经越发困难了,我去年申请的到现在还在审核中,由此可见,其申请难度是真的大。我于去年遭遇公司的企业级开发者账号被锁定,14天申诉,这个在我以往的文章中有表述过,请查看:《细
2020-11-21 16:07:47
2707
5
原创 使用队列组解决任务执行顺序
需求:其他任务需要在任务1和任务2执行完成之后再进行执行。//创建队列组 dispatch_group_t group = dispatch_group_create(); //创建并发队列 dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT); //先执行任务一和任务2,然后执行完1和2后通知执行任务3(可以在主线程执行任务3)
2020-10-29 16:07:45
465
原创 我们一起看一个多线程面试题一
以上图中所示题目,要想打印 2 的话,则可以通过以下几种方法实现:方式一:添加运行循环:dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSLog(@"1"); //下述代码本质是往runloop中添加定时器,因为是在block中执行,异步新建子线程默认不开启runloop,所以此处下面代码不会执行 .
2020-10-29 14:39:43
133
原创 线程保活进化版
A->B ,界面从A到B在B中开启一个子线程://创建线程2 self.stopped = NO; __weak typeof(self) wself = self; self.thread = [[GHThread alloc]initWithBlock:^{ NSLog(@"%s--begin--%@",__func__,[NSThread currentThread]); [[NSRunLoop cu
2020-10-27 16:25:10
119
原创 线程保活《二》
如若一个子线程开启是在一个view或者vc中,那么当vc或者view销毁后,那么其线程应该也随着销毁。A->B ,界面从A到B在B中开启一个子线程://创建线程 self.thread = [[GHThread alloc]initWithBlock:^{ NSLog(@"%s--begin--%@",__func__,[NSThread currentThread]); [[NSRunLoop currentRunL
2020-10-27 12:51:59
155
原创 这样做线程的保活
有时在工作中会遇到这种情况,我们开启了一个子线程,不希望它销毁,希望它可以一直存在,常驻后台或前台,但又不希望它一直工作,只有需要它的时候唤醒它,不需要它的时候让它休眠,这样当有问题要处理的时候,我们可以直接拿过来使用,不需要再重新开启新的子线程。这里我们使用runloop来解决这个问题:我们先创建一个类来监测线程是否被销毁:.h#import <Foundation/Foundation.h>@interface MJThread : NSThread@end.m#imp
2020-10-27 09:17:28
291
原创 runloop处理scrollview滚动时定时器失效的问题及runloop与timer的关系
static int count = 0;NSTimer *timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) { NSLog(@"%d",++count); }]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];由于NSTi.
2020-10-26 16:36:26
393
原创 runloop再探
runloop运行逻辑runloop休眠的实现原理:用户操作的是应用层面api,然后反馈到底层的是内核层面的api。有消息就唤醒发消息唤醒内核,处理用户操作反馈的消息,没有消息内核会让线程自动休眠。...
2020-10-26 16:26:20
100
原创 Runloop初探笔记
OC版runloop是C版CFRunLoopRef的封装:- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSLog(@"%p----%p", [NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]); NSLog(@"%
2020-10-26 16:10:42
144
原创 我们一起看下如何做iOS性能优化
性能优化的几个方面:CPU优化:GPU优化:耗电优化:启动优化:主要是针对冷启动的优化添加环境变量,打印启动时间:DYLD_PRINT_STATISTICS设置环境变量的值为1详细启动时间:DYLD_PRINT_STATISTICS_DETAILS安装包瘦身:LinkMapGitHub仓库。...
2020-10-23 16:24:26
217
原创 GCD定时器接口封装
个人最近学习回顾了定时器相关内容知识点,这里做一下笔记:注:接口内容包含了 创建定时器及执行定时器任务; 取消定时器任务; 关键代码加锁:定时器唯一标识操作加锁.h文件#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface GHTimer : NSObject+(NSString *)execTask:(void(^)(void))task...
2020-10-14 09:36:12
150
原创 如何做GCD定时器
GCD定时器和NSTimer相比有哪些优势呢?NSTimer底层是Runloop,如果Runloop处理的任务过多,过于繁重,会导致不准时。而GCD则不同,其依赖于系统内核,不受Runloop影响,所以相对来说更准时。//创建队列// dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_queue_t queue = dispatch_queue_create("timer", DISPATCH_QUEUE_SERI
2020-10-13 10:51:55
222
原创 NSTimer和CADisplayLink循环引用处理
方案一:引用中间件,NSProxy创建一个继承自NSProxy代理对象的子类:GHProxy.h#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface GHProxy : NSObject+ (instancetype)proxyWithTarget:(id)target;@property (weak, nonatomic) id target;@endNS_ASSUME_NONNULL
2020-10-13 10:01:25
129
原创 runtime - isa 位域
01 — 源码解读以前学习半路出家,只知道runtime是运行时,具体怎么用?底层原理是什么样子?为什么这样写?等都一无所知,当前趁着深挖底层,学习底层的机会,加深一下对runtime底层的理解,以便应对复杂多变的互联网环境。# if __arm64__# define ISA_MASK 0x0000000ffffffff8ULL# define ISA_MAGIC_MASK 0x000003f000000001ULL# define ISA_MAGIC_VALUE 0
2020-08-25 13:48:14
189
原创 Blcok相关经典面试题
题目:事例分析Block在ARC和MRC情况下的使用。typedef void(^eBlock)(void);/* 栈:函数体中定义的自动变量 系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活 由编译器自动分配释放 堆:用malloc,calloc,realloc等分配内存的函数分配得到的就是在堆上 是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。一...
2020-03-11 10:41:45
196
2
原创 细数挽救企业级开发者账号的日夜
“编者荐语: 路是一步步走出来的,路在脚下。 荆棘遍地在前,然后才是鲜花铺满地。”01—事件的前期演化事情的开始要从今年七月初凌晨两点多收到苹果官方审核团队发来的一封邮件说起:邮件内容简要:您的账号创建证书签名违规应用程序,现给14天的时间 找出问题并回复我们,否则将面临封号处罚。。。。。这可以称为暴风雨来临...
2020-03-09 14:08:42
531
原创 解决webview加载html或者txt高度计算及添加底部native按钮
效果图展示:https://vc.bilibili.com/mobile/detail?vc=2652765&bilifrom=1&share_source=copy_link&share_medium=iphone&bbid=ZA402AA19B6D79004FC4ADA70F0E8FF870F1&ts=1574162569...
2019-11-19 19:25:11
271
原创 cell中嵌套文本输入框
最近想买有这样一个需求:要求已在上图说明:第一想法是使用UITextView,首先使用它肯定可以的,只是它是嵌套在uitableview中,这样刷新的时候不免会使得几面抖动,或者自动换行异常等问题。这些都会造成用户使用起来不方便。所以本人研究了一下,最终完美的解决了这个问题。奉上demo如下:https://b23.tv/av76235885...
2019-11-19 18:02:17
768
原创 面试准备(面试题持续更新中)
第一种题目:设计模式(常见模式已标注)总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器...
2019-10-07 20:33:40
142
原创 ARM指令集的学习
1、ARMARM处理器,特点是体积小、低功耗、低成本、高性能,所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛。2、ARM处理器指令集armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。还...
2019-10-05 10:59:56
299
原创 Webview加载完底部黑线解决方案
同时设置:1.opaque = no; 2.backgroundcolor = [uicolor clearcolor]
2019-02-12 17:13:07
1508
2
原创 CAKeyframeAnimation
一个简单的关键帧动画创建一个继承自UIButton的子类:#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface CustomAnimationBtn : UIButton//执行动画- (void)playKeyAnimation;@endNS_ASSUME_NONNULL_E...
2018-12-29 17:22:57
532
原创 translatesAutoresizingMaskIntoConstraints
translatesAutoresizingMaskIntoConstraints属性和autolayout有关,如果你定义的view想用autolayout,就将translatesAutoresizingMaskIntoConstraints设为NO,如果你使用的不是autolayout,就将translatesAutoresizingMaskIntoConstraints设为YES...
2018-12-29 15:25:03
2099
原创 取消tableView的headerView的粘滞效果,使其与tableview一起滚动
//使得tableview每一组的headerview一起滚动- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat sectionHeaderHeight = 40; if (scrollView.contentOffset.y<=sectionHeaderHeight&&scro...
2018-12-29 10:30:21
458
原创 Xcode 10 error: Multiple commands produce...
Xcode 10 新clone React-Native 项目或者 clone类似Masonry example 时报错解决方案:
2018-12-29 09:36:27
634
原创 Xcode 10 error: Multiple commands produce...
Xcode 10 新clone React-Native 项目或者 clone类似Masonry example 时报错解决方案:
2018-12-29 09:36:22
607
原创 修改xib中cell单个控件约束
NSArray* constrains = cell.defaultTitle.constraints; for (NSLayoutConstraint* constraint in constrains) { if (constraint.firstAtt...
2018-12-29 09:31:59
439
原创 在建立网站遇到的问题和一些建议
内容列表:一个神奇的地方 如何购买域名 网站备案问题 服务器位置的选择 服务器商的选择一个神奇的地方 在建立一个网站之前,首先要考虑的第一件事就是它的受众是谁,主要用户在哪里,是在国内? 国外? 日本? 欧洲? 美国? 这决定了该网站服务器要放在哪里,以及使用什么样的域名后缀,以及备案等问题。如果你的网站受众在中国大陆,那么这篇文章也许会给你一些有用的建议。中国大陆的网络极...
2018-11-24 10:54:18
1495
原创 日期选择器(包含上、下午选择及年月日连选)
想获取源码的朋友,请移步到github。# GHDatePickerView/** * 1.显示时间选择器 * * @param title 标题 * @param defaultValue 默认值 * @param type 日期显示类型 * @param currentDate 默认选中的时间(值为空/值格式错误时,默...
2018-11-22 15:09:45
3923
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人