自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

njafei的博客

欢迎来到我的博客、希望可以帮助到您

  • 博客(68)
  • 收藏
  • 关注

原创 swift 多线程锁(一) NSLock

这里介绍下锁的概念,所谓的锁,就是当你操作这个变量的时候,把权限门锁上,等你开了锁之后,其他人才能操作这个变量,即保证同一时间只有一个操作行为我们先试用比较基础的NSLock来加锁,NSLock是互斥锁,对应的是自旋锁。互斥锁是指当一个线程进行访问的时候,该线程获得锁,其他线程进行访问的时候,将被操作系统挂起,直到该线程释放锁,其他线程才能对其进行访问,从而却确保了线程安全。

2023-12-15 10:28:10 1169

原创 [Swift学习] 访问控制 Access Control, private、public、filePrivate等修饰符

从整private , fileprivate,internal,public,openSwift Access ControlSwift provides five different access levels for entities within your code. These access levels are relative to the source file in which an entity is defined, and also relative to the module th

2022-09-01 16:24:59 569 1

原创 【Swift算法学习】 LeetCode 392 判断子序列

这里主要还是要考虑清楚,为什么双指针一次就可以完成遍历,并且保证能包含所有的结果。

2022-08-09 21:05:54 588

原创 【Swift算法学习】 LeetCode 同构字符串

执行用时:4 ms, 在所有 Swift 提交中击败了100.00%的用户内存消耗:14.3 MB, 在所有 Swift 提交中击败了70.45%的用户这里有两个注意事项swift string的读写效率问题双向绑定,单项的绑定需要判断下 map.values.contains(char2)...

2022-08-09 19:21:16 598

原创 【算法学习】LeetCode 724寻找数组的中心下标

【算法学习】LeetCode 724寻找数组的中心下标

2022-08-08 19:39:30 167

原创 [算法学习] LeetCode 1480. 一维数组的动态和

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。

2022-08-08 18:28:18 134

原创 iOS启动优化之—— 启动流程做了哪些事情

本文内容主要是根据 WWDC2019 Optimizing App Launch 内容编写先来个官方的PPT图,总共分为6个大的阶段这里主要做的是系统的一些初始化, 内容包括: dyld3, libSystemInitdyld 全称 the dynamic linker在WWDC17, 苹果推出了DYLD3(参考 App Startup Time: Past, Present, and Future),再次之前都是使用DYLD2.x,替换计划如下:相比2.x版本,3在性能、安全性、可靠性都有明显的提升这

2022-07-22 16:06:08 583

原创 iOS启动优化之——如何使用Xcode Log、App Launch、代码来计算启动时间 Launch Time

在iOS启动优化之——如何使用MetricKit 来计算启动时间 Launch Time ,我们提到,可以使用MetricKit 在Organizer中或者直接代码统计,那么还能用什么来统计呢?Xcode曾经提供了一些环境变量比如DYLD_PRINT_STATISTICS来提供时间统计(参考Xcode 动态库环境变量——不止DYLD_PRINT_STATISTICS),我们在Scheme的Run 环境变量中添加该参数,启动之后,Xcode会在log中打印如下内容:但是在iOS15之后,iOS 15 an

2022-07-12 16:26:15 3312

原创 iOS启动优化之——如何使用MetricKit 来计算启动时间 Launch Time

感兴趣的可以看下这篇博客,讲述的非常清楚iOS 性能优化:使用 MetricKit 2.0 收集数据MetricKit提供了非常方便的回调,接入的步骤只有两个:先看下注册的代码,我们新建一个类来监听MetricKit,然后实现MetricKit的回调然后在App启动后注册这样,iOS会每24小时呼起两个DidReceive回调,传递回来数据。当然,我们开发的时候不可能一直测试等待数据,所以XCode 提供了Debug功能,注意只有真机支持该Debug能力位置如下: Debug -> Simulate

2022-07-11 17:59:14 1148

原创 SwiftGen swift项目资源管理方案

如果在swift项目中更高效的管理资源文件? 来试试swiftgen吧,提供编译检查、自动生成代码等能力,非常好用

2022-07-07 17:57:05 1237

原创 swift init构造方法,convinience 及 convinience, swift和OC的初始化思路对比

在学习如何使用swift的init构造方法的具体用法前,我们先设想一个场景: 有个学生系统包含学生类,学生有名字和年龄,名字是必填的,年龄是非必填的,如何设计这个类呢?OC是如何完成的?我们先使用OC来完成,方便后面对比:先看下类设计:@interface LFStudent : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) NSInteger age;@end然后我们

2021-11-25 21:52:42 2248

原创 一个NSObject对象占内存多少? 如何计算出来?

在iOS的面试中,有一道经典的题目,NSObject对象占内存多少?很多人能回答个大概,但是对于内部的实现或者这道题的升级就有些含糊了,我们今天来升级下这道题目,然后基于此看下底层的源代码是如何实现的题目NSObject *obj = [[NSObject alloc] init];NSLog(@"class_getInstanceSize = %zd", class_getInstanceSize([NSObject class]));NSLog(@"malloc_size = %zd", mal

2021-05-20 18:35:15 279

原创 Swift之字符串常用知识点

本文重点讲了Swift中字符串的新特性,以及常用的知识点字符串支持隐式多行赋值 “”" “”"字符串可以直接换行了,使用成对的三个双引号来包括,注意,这样的形式必须从第二行开始定义字符串//incorrectlet string0 = """this is me"""//correctlet string0 = """this is me"""//"this is me"如果想要换行,直接更换一行即可,前后想多一行换行,直接留空一行//"this is me\n"let s

2021-05-19 15:09:53 814 1

原创 Swift基本运算符和OC相对,变化和增加的内容

Swift中大部分的运算符和OC都是共用的,只是部分符号做了优化,并增加了部分符号,如??空合运算符、区间运算符a..<b等,,以下为优化内容:=与 C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值。所以下面语句是无效的:if x = y { // 此句错误,因为 x = y 并不返回任何值}避免了常见的== 写成 = 的错误多元组的赋值有点像是ES6中的解构赋值,ES6中是这样的:[a, b] = [10, 20];而在Swift中是这

2021-05-12 21:05:15 151

原创 Swift 可选类型使用及设计思路推测, ?、!、 ??等的用法

在可选类型之前,我们有个概念要搞清楚,类型安全。 什么是类型安全呢? 从字面上理解,就是这个类型是安全的,即这个类型不可以被赋予其他类型的值。 比如一个string类型的变量,不可以被赋值一个int值。OC是不是类型安全呢? 不是的,比如很多对象都可以被赋予nil,这就属于赋予其他类型。在OC中,如果想要判断某个值是否含有有效值,我们通常会使用nil来判断,但是nil的作用范围仅限于大部分对象,对于struct等类型,还需要判断是否NSNotFound等基于此,Swift语法中进行了改良,提供了可选类

2021-05-11 21:23:03 780 1

原创 Dart 基础类型 var、dynamic、object、final

强类型首先要明确一点,dart是强类型语言,何为强类型,简单来说就是变量一但确认它的类型,除非明确进行类型转换,否则不可以被当做其他类型使用,这点和JS等弱类型语言是有区别的。如果对强弱类型感兴趣,可以参考:什么是强类型语言,什么是弱类型语言,为什么python也是强类型语言。dart为什么要使用强类型,在其官网中也有介绍Dart 语言里的类型体系在编译时就可以检查并显示类型相关的错误。安全的类型系统强制要求代码明确类型,因此在编译时会显示与类型相关的错误,这些错误可能在运行时可能很难发现。

2021-04-08 16:01:45 586 2

原创 UIAppearance、UI_APPEARANCE_SELECTOR的使用

当我们封装第三方库的时候,我们通常会希望将Api设置的更灵活一些,以方便使用者进行定制,在这些自定义的需求里面,UI的定制又是一个比较大的需求。 苹果在设计UIKit的时候,也提供了一个Protocol用于定制,那就是UIAppearance。使用场景先看下UIAppearance的使用,试想一个场景,新建一个App,这个App的基础色是蓝色,NavigationBar都是蓝色背景,白色文字,同时所有页面的背景色都是浅灰色,文字默认的Font是宋体。如何实现这个需求呢?先说通常的做法,很多App会基于

2021-03-01 17:29:21 575

原创 React Native性能优化

关于帧在讲述如何优化性能之前,我们要先了解一下性能的概念。对一个从未接触过相关概念的人来说,所谓的性能就是当你去使用App的时候很流畅,点击、跳转等交互效果反应很快,而且很顺滑。这是感性的角度,那么理性的角度或者数据的角度看待呢?这里要介绍一个概念: 帧率。我们知道,所谓的动画或者电影,其实归根结底就是在一秒内快速闪过多张不同的图片,如果快到一定的程度,肉眼会误以为里面的动画都是连贯的。在iOS等设

2017-10-26 09:58:11 1038

原创 ImageOptm 自动化无损优化图片

iOS控制包的大小对于公司来说,是个非常重要的事情。因为苹果公司对于包的大小超过100M的,不会允许用户使用移动网络来下载,这很可能造成商业上的损失。而在控制包的大小中,一个很重要的原则就是禁止大图片。之前研究其他公司的ipa包的时候,就出现过一个icon高达1M的事故。而平时,虽然程序员们百般小心,难免被设计师暗算给张大图(玩笑),所以靠人终究不是一个可持续的保证质量的方法。平时用的无损压缩最多的

2017-09-26 11:06:02 1039

原创 Java对空格的encode格式问题

今天发现了一个非常奇怪的问题,服务端给了一个encode的url,内容是位“1 1”:encode之后是1+1前端decode之后是1+1可是在其他的浏览器等decode之后的结果是:1 1发现java的encode有个坑,在java中,encode遵循的标准是rfc1738,而在iOS中,encode遵循的标准是rfc2396,两者对于空格的encode不同rfc1738 => +rfc2396

2017-09-25 10:00:01 1346

原创 panResponder详解及Demo

我们知道,react-native封装了一系列的组件例如<Touchable**>来提供触摸事件的反馈,另外Button、Text等组件也提供了简单的点击方法来给组件快速添加触摸事件。但是这些组件都是针对某个特定的效果,因其是定制的,所以可自定义、调整的部分就会很少,至多是效果有个选项。那么,如果我们希望做复杂的效果,改怎么办呢?答案是panResopner。先看下panResponder的说明:

2017-08-01 19:02:16 7425 1

原创 React-Native优化之PureComponent

React15.3的发布中包含了PureComponent,这个类最重要的用法是为了优化React的性能,下面我们将看下它是如何优化的。Component VS PureComponent首先要看Component的生命周期: 当props或者state改变的时候,会执行shouldComponentUpdate方法来判断是否需要重新render组建,我们平时在做页面的性能优化的时候,往往也是通过

2017-07-27 19:03:10 5624

原创 react-native time定时器 防止内存泄露的注意点

time是react-native提供的一个定时器,在实际使用中,经常会有使用不对,造成内存泄露的情况。很多React Native应用发生致命错误(闪退)是与计时器有关。具体来说,是在某个组件被卸载(unmount)之后,计时器却仍然在运行。防止出问题的办法也很简单,在unmount的时候,增加卸载定时器的操作:componentDidMount() { this.timer = setT

2017-07-27 15:55:32 1716

原创 listView和FlatList的flexGrow默认值为1

今天遇到了适配的问题,有个列表,需要自适应高度,按理说默认应该就是自适应的,但是在实际中发现,其会和另外一个视图1:1 ,然后就发现只有设置其flexGrow: 0的时候,它才会自动适配高度,说明它的flexGrow默认值为1.看下具体的列子:import React, { Component } from 'react';import { AppRegistry, StyleSheet,

2017-07-26 19:33:05 1429

原创 如何访问和修改一个对象的私有属性

有两个思路:KVCruntime先给出我们接下来要使用的类:@interface Person : NSObject@end@interface Person()@property (nonatomic, copy) NSString *name;@end@implementation Person@endKVCKVC是我比较推荐的,代码如下:Person *person = [Person

2017-06-15 18:11:27 1207

原创 Error RawText ** must be wrapped in an explicit <Text> component 问题解决

今天忽然遇到一个页面崩溃,查到错误如下:Error: RawText "" must be wrapped in an explicit <Text> component. 查了代码,发现好久都没有动这块的代码了,所以非常疑惑。最后通过2分法不停地查哪里出了问题,最终查到了这个语句:return ( <View> {test && test.string &&

2017-06-14 11:20:01 2942

原创 block

其实使用block的时间也蛮久了,比如使用__block,weak防止循环引用,copy修饰等注意点也都知道,但是一直没有去看过官方的文档,仔细看下所有的点。今天就把官方文档撸一遍,深入了解下。使用场景苹果在介绍block的使用场景时,是这么说的: You use a block when you want to create units of work (that is, code segme

2017-06-13 15:59:59 355

原创 os.system如何传参

今天写脚本的时候,正好希望在python脚本中调用另外一个python脚本,就使用了os.system来实现这个功能(当然,还有很多的办法,而且每种方法满足的需求不都一样,有兴趣的读者可以谷歌下)。但是我需要给这个调用里面传入一个参数,网上查了半天,感觉都不太清晰,就写了这篇,简单介绍下。os.system的定义是这样的os.system("shell command argusFormat" %

2017-05-26 11:30:18 42017 8

原创 ES6之字符串拓展

ES6中,还是对字符串做了很多的改进,尤其是函数方面,增加了很多个方法。但是核心的变动,其实只有两个:Unicode拓展字符模板Unicode拓展在讲ES6之间,我们先了解一些背景知识。为什么会出现Unicode我们知道,计算机最底层其实只能识别‘0’和‘1’,就是yes或者no。但是人脑是非常高级的,我们见面会打招呼“您吃了没?”,这句话如果是想告知计算机的话,它肯定是听不懂的,最后计算机接

2017-05-23 17:56:13 493

原创 react-native基类设计

背景前段时间发现iOS手机上,很多页面的字体样式会随着系统配置字体的大小而变换,使得界面不太美观。而这个其实只要给一个参数就可以解决,但是整个app中用该组件的地方非常多,开发挨个替换的话,工作量很大,而且很容易出现遗漏。另外升级RN后,出现了Android手机上面的Text点击崩溃问题,底层的bug,前端需求的话,也是要花费相当精力而且容易遗漏。那么,对于类似的问题,有没有好的解决方案呢?解决思路

2017-05-20 11:28:49 2279 2

原创 Android上的RN不能展示尺寸大的图,怎么办?

背景最近遇到一个营销的需求,一个简单的界面,上面是一个计数器,下面是一张介绍图。所以下面直接用了Image标签来做。但是在测试中发现了一个问题,部分的Android手机上面展示不出来图片。使用Android studio检查了下log,发现了如下的错误: OpenGLRenderer: Bitmap too large to be uploaded into a texture (750x452

2017-05-18 17:50:23 1815 1

原创 ES6之变量的解构赋值

什么是解构赋值以前,如果我们想给一个变量赋值,通常是这样(在Objective-C等语言中,现在仍然是如此):let a = 1;let b = 2;let c = 3;而ES6现在支持了类似这样的用法:let [a,b,c] = [1,2,3];从而大大简化了变量赋值的语法,而且为诸如:Json解析、函数默认值用法提供了支持,文章最后会介绍。JS的变量解构赋值,实际上的一种模式匹配,比如:{模

2017-05-11 17:17:38 489

原创 图片的展示清晰度问题研究

前两天产品经理找我,说是首页的轮播图,看起来很模糊,我看了下,确实是效果不好,很多的字看起来不都清晰,看明白是什么很费劲。看起来效果像是这样(忽然想起一个老朋友,北大高材生,居然喜欢杨幂,这里就用大幂幂吧)我当时的第一反应就是是不是原图就不清晰。然后我抓包,拿到了图片链接,但是链接的图片在浏览器中看起来效果很不错,像这样:但是展示在手机上的效果,真的差强人意,尤其是有文字的时候,文字的边缘锐化的效果

2017-05-05 15:41:26 539

原创 iOS Runtime 详解

什么是runtime依照苹果文档的说法,runtime是: The Objective-C language defers as many decisions as it can from compile time and link time to runtime. (尽量将决定放到运行的时候,而不是在编译和链接过程)如何理解这段话呢,我们首先要知道,一段代码从写完到最终执行的过程中发

2017-05-04 17:06:20 1997

原创 Method,SEL,IMP

这三个概念,虽然在平时的时候总是在用,但是最近写runtime的时候,又感觉有点糊涂,今天就把他们的关系搞清楚。Method先看下定义runtime.h/// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型typedef struct objc_method *Method;struct

2017-05-03 16:20:30 796

原创 SQLite-Python学习

title: SQLite-Python学习 date: 2017-04-28 11:05:29 tags: - sqlite - pythoncategories: 数据库 注: 本文默认有基本的数据库和SQLite知识最近在做SQLite数据库相关的自动化任务,所以学习了下phthon中如何使用SQLite,网上的教程如:runoob、 docs.python

2017-04-28 11:24:14 893

原创 KVC详解

综述关于正常访问或者修改一个对象的属性,都是通过getter和setter方法,但是Cocoa仍然提供了一个间接访问属性的方法:KVC(Key-Value Coding)。 只要对象支持NSKeyValueCoding协议,我们就可以通过KVC来间接访问或者修改属性和属性中的更深层的属性。KVC也是许多Cocoa技术的基础,比如:KVOCocoa bingdingsCore DataAppl

2017-04-18 18:02:49 839

原创 《ES6入门》读书笔记之let和const命令

title: 《ES6入门》读书笔记之let命令 date: 2017-04-17 15:37:38 tags: - React-Native - 读书笔记categories: React-Native正在读阮一峰的《ECMAScript 6 入门》,本系列博客都是读书笔记。ES6 PlayGround在介绍具体的内容之前,想给大家介绍一个好玩的playgroud,尤其合

2017-04-17 15:50:45 610

原创 RN 最容易crash的代码用法及应对措施(持续更新)

变量保护出现最多的就是在使用redux来做数据层,使用this.props的属性没有去查询时候为undefined,这种情况,基本是必crash比如下例://show user name<Text>{this.props.userInfo.name}</Text>如果userInfo为undefined的话,就会崩溃,错误如下: TypeError: Cannot read property

2017-04-17 11:14:43 2528

原创 如何给同一个电脑上的不同项目设置不同的name和email

最近在自己的电脑上同时使用github和公司的git仓库,带来了一个问题就是之前只是设置了全局的name和email,但是两边的代码需要使用不同的user,每次都要手动去改,然后我搜索了下,发现其实我们可以给每个git项目,单独配置一个name和email的。规则如下: 如果项目由独立配置,则使用独立配置,如果没有独立配置,则使用全局配置命令就很简单了: 全局name和email配置:$ g

2017-04-11 14:47:30 662

空空如也

空空如也

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

TA关注的人

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