自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 资源 (2)
  • 收藏
  • 关注

原创 iOS 打包时出现在other items里面

多个target打包的时候,打的包在other items里面,无法上传,无法导出解决办法:1>依赖库工程​的Targets - Building Setting - Skip install 设置为YES,2>主工程的​Targets - Building Setting - Skip install 设置为NO,3>依赖库的头文件Targets - Build Phases - Headers下的头文件必须放在Project,不能放在Public 和 Private.

2021-08-11 17:40:30 257

原创 003- iOS底层源码探究之内存优化(属性重排)

在上一篇文章iOS底层源码探究之结构体、内存对齐中已经证明结构体内存大小与结构体成员内存大小的顺序有关。这里我们来研究在OC中,是怎么来进行内存优化的。自定义SZPerson类,不定义任何成员变量和属性- (void)viewDidLoad { [super viewDidLoad]; SZPerson *person = [[SZPerson alloc] init]; NSLog(@"obj对象类型占用内存的大小:%lu",sizeof(person)); .

2021-08-10 10:32:03 187

原创 002- iOS底层源码探究之结构体、内存对齐

做开发的听得最多的一句话就是万物皆对象,如果没有,你就new一个。Objective-C是一门面向对象的语言,其中最重要的两个概念就是类和对象,OC中,对象分为三类:instance对象(实例对象)、class对象(类对象)、meta-class对象(元类对象)。今天我们研究的就是实例对象。...

2021-08-09 10:36:41 205

原创 iOS loadView

1、loadView的作用loadView方法是用来负责创建UIViewController的view的2、loadView什么时候被调用?每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。3、loadView的实现如果当前控制器不实现loadView方法,会默认调用父类的loadView方法, 默认系统怎么加载控制器的view呢,先去storyboard里面找,没有

2021-07-20 14:23:48 549

原创 iOS之CGContextAddArc画圆弧

CGContextAddArc(CGContextRef cg_nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)// CGContextRef cg_nullable c 图形上下文// CGFloat x 圆心x坐标// CGFloat y 圆形y坐标// CGFloat radius 圆半径// CGFloat..

2021-07-09 14:17:09 324

原创 iOS tableview调用cell移动方法没有动画效果

需要给tableview加上footview就会有动画效果

2021-06-23 18:36:38 238

原创 iOS 按比例实现方块图

原理:二分法递归实现,就是每次“对半分”,分到只剩两个@interface SZBlockView : UIView@property (nonatomic, strong) NSArray *data;//数据源@end#import "SZBlockView.h"#import "SZItemView.h"@implementation SZBlockView- (instancetype)initWithFrame:(CGRect)frame{ self = [sup

2021-06-11 10:36:16 200

原创 iOS常用算法之插入排序

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。插入排序代码:- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *array..

2021-04-30 15:55:00 201 1

原创 iOS常用算法之快速排序

快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序(Quick Sort)是实际开发中经常选用的一种排序方式。其排序原理:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边...

2021-04-30 15:43:02 760 1

原创 ios CAShapeLayer

CAShapeLayer & CALayerCAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性。CAShapeLayer有不同于CALayer的属性,它从CALayer继承而来的属性在绘制时是不起作用的。 普通CALayer在被初始化的时候是需要给一个frame的值的,这个frame值一般都与给定view的bounds值一致,它本身是有形状的,而且是矩形。CAShapeLayer初始化时也需要指定frame值,但它本身没有形状,它的形状来源于其属性path。

2021-04-21 10:07:31 571

原创 iOS pod install和pod update区别

首先我们了解一下Podfile.lock:当我们用cocoapod管理第三方库的时候,在第一次运行pod install时会自动生成一个Podfile.lock文件,Podfile.lock文件主要包含三个块:PODS、DEPENDENCIES、SPEC CHECKSUMS,用来记录每个pod的版本号、依赖的其他库和每个库对应的podspec.json文件的checksum(SHA-1算法)。通过这些信息可以确保多人协作的时候,大家使用的是相同版本的第三方库。Podfile.lock 中...

2021-03-24 11:43:49 352

原创 001- iOS底层源码探究之alloc、init

首先我们来看一段代码:Person *p1 = [Person alloc];Person *p2 = [p1 init];Person *p3 = [p1 init];Person *p4 = [Person new];Person *p5 = [p4 init];NSLog(@"%@ - %@p - %p",p1,p1,&p1);NSLog(@"%@ - %@p - %p",p2,p2,&p2);NSLog(@"%@ - %@p - %p",p3,p3,&p3

2021-03-22 11:47:56 251

原创 iOS 手把手教你shell脚本自动化打包

第一步:准备脚本文件,代码如下#工程名(自定义)project_name=你的工程名#打包模式 Debug/Release(自定义)development_mode=Release#scheme名(自定义,一般与工程名相同)scheme_name=你的工程名#plist文件所在路径exportOptionsPlistPath=./ExportOptions.plist#导出.ipa文件所在路径exportFilePath=~/Desktop/$project_name-ipa

2021-03-15 10:32:37 911

原创 iOS App启动优化(二)

这篇文章简单讲一下启动优化的二进制重排应用程序在运行时,使用的是虚拟内存与物理内存相结合的方法加载数据的;虚拟内存是分页管理的,当使用到某一页虚拟内存的数据时,需要将对应的真实数据加载到物理内存中,将虚拟内存与物理内存之间形成一个映射关系,这个操作称为缺页异常(page fault),并且这个操作是需耗时的。1、查看iOS应用的载入数据的顺序,我们可以通过设置Write Link Map File为yes,来查看应用数据加载的顺序...

2021-03-11 11:12:04 148 4

原创 iOS国际化获取所有的中文汉字

已有的项目要做国际化,需要把工程中所有的中文字符拿去翻译,正好还需要自己翻译,所以就用了一个python脚本。创建两个简单的python文件main.pyimport osimport SZGetCNStrTooldef main(): os.system("SZGetCNStrTool.py")if __name__ == '__main__': main()SZGetCNStrTool.py#-*- coding:utf-8-*-#处理中文字符的情况i

2021-03-10 10:36:17 549

原创 Mac+VSCode安装flutter环境

第一步:去flutter官网下载最新的SDK下载下来之后会自动解压,然后将解压后的flutter文件夹放到某个目录下,后面配置环境变量需要路径,我就放在和桌面同级第二步:配置环境变量1、执行命令: vim ~/.bash_profile2、键盘输入i3、复制代码粘贴export PATH=~/flutter/bin:$PATH export PUB_HOSTED_URL=https://pub.flutter-io.cnexport FLUTTER_STORAGE_B.

2021-03-09 13:51:25 702 1

原创 mac10.15.6安装homebrew提示curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection

homebrew官网安装命令/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"报错如下:curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refuse换个命令试试/bin/zsh -c "$(curl -fsSL https://g..

2021-03-05 11:20:32 201

原创 iOS常用算法之选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。稳定性:选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了

2021-03-04 17:10:54 232 1

原创 iOS常用算法之冒泡排序

冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素,如果一个元素比另一个元素大/小,那么就交换这两个元素的位置。重复一直比较到最后一个元素.1.基本的冒泡排序算法:-(void)bubbleSorting{ int account = 0; NSMutableArray *array = [NSMutableArray arrayWithObjects:@3,@2,@9,@1,@6,@7,@4,@5,@8,nil]; NSLog(@"排序之前的数组===

2021-03-04 16:43:04 1449 2

原创 浅谈iOS KVC

1、KVC<Key-value-coding>键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的。无论是Swift还是Objective-C,KVC的定义都是对NSObject的扩展来实现的(Objective-C中有个显式

2021-03-04 10:03:13 165 4

原创 浅谈iOS KVO

1、KVO<Key-Value-Observing>顾名思义,键值监听,可以用于监听某个对象属性值的变化。KVO是一个非正式协议,提供了一个途径,使对象(观察者)能够观察其他对象(被观察者)的属性,当被观察者的属性发生变化时,观察者就会被告知该变化。首先了解一下KVO的基本使用,然后在此基础上,我们深入了解一下KVO的底层实现原理。//给一个对象属性添加KVO监听[self addObserver:(nonnull NSObject *) forKeyPath:(non

2021-03-03 10:29:17 1157 3

原创 通俗易懂的ios方法调用底层原理

1、创建一个Person类,有一个对象方法eat和一个实例方法run,并分别调用@interface Person : NSObject+(void)eat;//类方法-(void)run;//实例方法@end1、类在Runtime中的结构struct objc_class { Class isa OBJC_ISA_AVAILABILITY; //isa指针 //实例的isa指向类对象,类对象的isa指向元类#if !__OBJC2__ Class

2021-03-02 17:35:03 537

原创 iOS 农历和阳历切换

为了实现下图农历还阳历切换效果:为了实现上面效果,在网上找了许多也没有能用的,于是自己手写了一个农历的Json文件,数据从1901年到2030年点击下载

2021-03-01 16:00:24 264

原创 iOS Xcode环境变量配置

1、配置环境变量2、常用环境变量DYLD_PRINT_STATISTICS //监控并打印应用启动时间OBJC_PRINT_LOAD_METHODS//打印实现load方法的类OBJC_PRINT_IMAGES//输出已load的image信息OBJC_PRINT_IMAGE_TIMES//测量图像加载步骤的持续时间OBJC_PRINT_INITIALIZE_METHODS//打印 Class 的 + (void)initialize 的调用信息OBJC_PRINT_RES

2021-03-01 15:32:13 719

原创 iOS App启动优化(一)

一、“冷启动”与“热启动”冷启动:App点击启动前,此时App的进程还不在系统里。需要系统新创建一个进程分配给App。(这是一次完整的App启动过程)热启动:App在冷启动后用户将App退回后台,此时App的进程还在系统里。用户重新返回App的过程。(热启动做的事较少)二、App的完整启动流程(冷启动流程)1、main()函数执行前(pre-main阶段)我们可以通过设置环境变量DYLD_PRINT_STATISTICS来起到监控main()函数执行前启动时间打印出..

2021-03-01 15:16:13 365

原创 iOS app上架遇到的一些问题(持续更新)

1.Info.plist文件里面的权限弹窗的语言要与App上架时的主要语言保持一致2.如果有做隐藏提示更新的话,提交审核的时候记得要后台隐藏,还有就是隐藏的字段最好不要用audio字段(反正我是被这个字段坑过)3.icon图标不要有透明度4.要登录的app需要提供测试账号,如果有内购,还需要提供沙盒账号...

2021-02-26 15:22:20 268

原创 ios app证书介绍

在我们开发是时候,有时候候证书可能出现各种问题,首先我简单讲一下证书其实主要就是这三个,捋清楚他们之间的关系,其实也就简单了Certificates 在这里创建开发证书和生产证书,还有推送证书(有推送功能需要),一个账号可以创建3-4个开发证书,但是一般创建一个就可以了,因为一个证书可以对应多个app Identifiers 在我看来就是注册Bundle Id,因为这就是你app的唯一标识符 Profiles 描述文件,就是将你的Certificates证书和...

2021-02-26 15:12:58 1359

原创 Xcode12 合并模拟器和真机.a文件报错arm64解决

在build setting设置Excluded Architectures中设置模拟器的SDK去掉arm64架构,如下图所示:就是在用模拟器生成.a文件的时候加上arm64,早用真机生成.a文件的时候记得去掉arm64

2021-02-26 09:56:08 1201

原创 iOS hmac(哈希)256带密钥的加密方法

找了很多地方都没有找到ios关于哈希带密钥的加密方法,最终还是在朋友的帮助下搞定的。-(NSString*) hmacForSecret:(NSString*)secret data:(NSString*)data {        constchar *cKey  = [secretcStringUsingEncoding:NSASCIIStringE

2016-04-21 15:58:38 2985 2

objc4-818.2.zip

研究oc底层,可以直接断点运行的objc源码

2021-08-09

nongli.json

nongli.json

2021-03-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除