精华内容
下载资源
问答
  • 下面我们来盘点一下系统重构工具箱里都有什么,也就是看一看系统重构到底都有哪些方法。系统重构总是在不同层次上调整我们的代码,因此重构方法也就分为了多个层次。从总体上看,重构方法分为以下几个层次:方法的...

    下面我们来盘点一下系统重构工具箱里都有什么,也就是看一看系统重构到底都有哪些方法。系统重构总是在不同层次上调整我们的代码,因此重构方法也就分为了多个层次。从总体上看,重构方法分为以下几个层次:方法的重构、对象的重构、对象间的重构、继承体系间的重构、组织数据的重构与体系架构的重构。

    前面那个例子我们可以清楚地看到方法的重构过程。方法的重构往往发生在一个对象的内部,是对一个对象内部的优化。从这个例子中,我们首先看到了增加注释、调整顺序、重命名变量、进行分段等操作,这些虽然不是什么重构方法,却是我们进行前期准备的常用技法。随后我们将通过注释分段存放的各个代码段提取出来,形成单独的函数。这种重构方法被称为“抽取方法(Extract Method)”。

    随后我们继续重构。仔细观察这个程序我们发现,这个程序内聚性不好。最好用一个DateUtil管理诸如getHour()的方法,用Greeting管理各种问候语及其规则,因此我们进行了如下重构:

    /**
     * A utility about time.
     * @author fangang
     */
    public class DateUtil {
    	/**
    	 * Get hour of day.
    	 * @param date
    	 * @return hour of day
    	 */
    	public int getHour(Date date){
    		Calendar calendar = Calendar.getInstance();
    		calendar.setTime(date);
    		return calendar.get(Calendar.HOUR_OF_DAY);
    	}
    }
    
    /**
     * All kinds of greeting.
     * @author fangang
     */
    public class Greeting {
    	/**
    	 * Get the first greeting.
    	 * @param user
    	 * @return Hi, {user}.
    	 */
    	public String getFirstGreeting(String user){
    		return "Hi, "+user+". ";
    	}
    	
    	/**
    	 * Get the second greeting.
    	 * @param hour
    	 * @return if in the morning, say "Good morning!", 
    	 * if in the afternoon, say "Good afternoon!", 
    	 * else say "Good night!".
    	 */
    	public String getSecondGreeting(int hour){
    		if(hour>=6 && hour<12){
    			return "Good morning!";
    		}else if(hour>=12 && hour<19){
    			return "Good afternoon!";
    		}else{
    			return "Good night!";
    		}
    	}
    }
    
    /**
     * The Refactoring's hello-world program
     * @author fangang
     */
    public class HelloWorld {
    	/**
    	 * Say hello to everyone
    	 * @param now
    	 * @param user
    	 * @return the words what to say
    	 */
    	public String sayHello(Date now, String user){
    		DateUtil dateUtil = new DateUtil();
    		int hour = dateUtil.getHour(now);
    		
    		Greeting greeting = new Greeting();
    		return greeting.getFirstGreeting(user)+
    				greeting.getSecondGreeting(hour);
    	}
    }

    这里我们将getHour()从HelloWorld类中抽取出来,放到了DateUtil类中,使HelloWorld类中仅保留一个引用。同时,我们将getFirstGreeting()与getSecondGreeting()从HelloWorld类中抽取出来,放到了Greeting类中,使原程序变为引用。这样的技法我们称之为“抽取类(Extract Class)”。

    再仔细观察这一段程序:

    	/**
    	 * Get the second greeting.
    	 * @param hour
    	 * @return if in the morning, say "Good morning!", 
    	 * if in the afternoon, say "Good afternoon!", 
    	 * else say "Good night!".
    	 */
    	public String getSecondGreeting(int hour){
    		if(hour>=6 && hour<12){
    			return "Good morning!";
    		}else if(hour>=12 && hour<19){
    			return "Good afternoon!";
    		}else{
    			return "Good night!";
    		}
    	}

    除了morning,afternoon, night以外,如果我们再增加evening,程序的可扩展性就不好了。因此我们将它们提取出GreetingRule接口,并分别编写了morning, afternoon, night和evening的实现类:

    /**
     * Greeting rules interface
     * @author fangang
     */
    public interface GreetingRule {
    	/**
    	 * @param hour
    	 * @return whether the rule is right
    	 */
    	public boolean isRight(int hour);
    	
    	/**
    	 * @return the greeting words
    	 */
    	public String getGreeting();
    }
    
    /**
     * The greeting in the morning
     * @author fangang
     */
    public class MorningGreeting implements GreetingRule {
    
    	/* (non-Javadoc)
    	 * @see org.refactoring.helloWorld...GreetingRule#getGreeting()
    	 */
    	@Override
    	public String getGreeting() {
    		return "Good morning! ";
    	}
    
    	/* (non-Javadoc)
    	 * @see org.refactoring.helloWorld...GreetingRule#isRight(int)
    	 */
    	@Override
    	public boolean isRight(int hour) {
    		if(hour>=6 && hour<12){
    			return true;
    		}
    		return false;
    	}
    }

    其它几个实现类我就不累牍了,最后将getSecondGreeting()方法改成这样:

    <span style="white-space:pre">	</span>/**
    	 * Get the second greeting.
    	 * @param hour
    	 * @return if in the morning, say "Good morning!", 
    	 * if in the afternoon, say "Good afternoon!", 
    	 * if in the evening, say "Good evening! ",
    	 * else, say "Good night!".
    	 */
    	public String getSecondGreeting(int hour){
    		for(GreetingRule greetingRule : greetingRules){
    			if(greetingRule.isRight(hour)){
    				return greetingRule.getGreeting();
    			}
    		}
    		throw new RuntimeException("Error when greeting! ");
    	}

    这种将相似的,或者同类型的代码抽取出来形成接口,以及接口下的多个实现,我们称之为“抽取接口(Extract Interface)”。

    看了这些例子你可能会有一个疑问,这样简单的程序搞成这样,是否值得?是的,不错,程序的结构应当与需求的复杂度相适应。简单的需求编写简单的程序,复杂的需求编写复杂的程序。如果将简单的需求,为了玩技术,搞成了复杂的程序,那就是“过度设计”。但这里为了更加清楚的向大家展示重构,又能够使大家不要因为复杂的程序而分心,故而将简单程序过度设计了一把。但在后面我们可以看到,当业务需求逐渐复杂时,我们进行以上这些重构是值得的。

    文后附录列出了所有的重构方法,它们都来源于重构经典书籍《重构,改善既有代码的设计》,在日后的时间我们应当反复咀嚼这些方法。

    正如武侠大师金庸所说的“无招胜有招”,如此多的重构方法不是要让你去生搬硬套,而是应该对其进行深刻理解以后,最终变成你自己的重构方法。我们在实际工作中不要过于介意我们用了什么重构方法,哪次重构是用的哪个方法,只要是合适的设计就OK。但是,在无招胜有招之前,我们必须要有招,即学会了、理解了各个招式,在实际工作中你才能想起这些招式,去运用这些招式。学习与实践总是两个相辅相成、相互促进的过程。

    然而,系统重构经典书籍不少,指导我们实践的书籍却不多。相信有许许多多有志之士,在看过重构的书籍以后,激情洋溢、热血澎湃,但回到现实世界中,回到实际工作中却无所适从,经过一番苦苦挣扎之后,从此作罢。因此,本书将从实践出发,用实际工作中的示例,用更加真实的视角向大家展示,系统重构是怎样指导我们工作的,让大家真正地用起来。

    大话重构连载首页:http://blog.csdn.net/mooodo/article/details/32083021

    特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢!


    展开全文
  • 最近发现一种可以直接理解代码结构的代码比较和版本控制工具semanticmerge (https://www.semanticmerge.com/), 其中有很...我想问一下大家知不知道类似这种能够比较代码结构(structural comparison)的开源软件有哪些呢?
  • Mybridge比较了近1000个的Python...使用开源库可以大大加快你的开发效率,下面我们一起来看看上榜的34个Python库都有哪些:1Pipenvhttps://github.com/pypa/pipenvStar 15710Pipenv 是 Python.org 官方推进的 Pytho...

    Mybridge比较了近1000个的Python开源库,并从中评选出34个最有用的工具来帮助你的开发,这些开源项目被分成8个大类,平均Star为3293。

    c8468a05f449c47817ed095883efadbc.png

    使用开源库可以大大加快你的开发效率,下面我们一起来看看上榜的34个Python库都有哪些:

    1

    Pipenv

    https://github.com/pypa/pipenvStar 15710

    75f4c0935b705c9cdb55b5bf13023d64.png

    Pipenv 是 Python.org 官方推进的 Python 包管理工具,旨在将所有包管理工具(如 bundler、composer、npm、cargo、yarn 等)的优点集中应用于 Python 领域中的工具。它对各个平台都有很好的支持。

    2

    Pyxel

    https://github.com/kitao/pyxel Star 4884

    a602506bf63ce1380fdc8fbecb4c90f0.png

    Python的复古游戏引擎,只能显示16种颜色,同时只能播放4种声音

    3

    PyTest v3.5

    https://github.com/pytest-dev/pytest Star 3631

    2a64986806087efdad246e7779c62662.png

    pytest 是一个成熟的全功能的 Python 测试工具。

    4

    Poetry

    https://github.com/sdispater/poetry Star 3228

    b17f4d5a6432a7eabbf46ebdaa5dbcc9.png

    poetry 是一个包管理和打包的工具。poetry 将所有的配置都放置在一个 toml 文件中,这些配置包括:依赖管理、构建、打包、发布。

    5

    Loguru

    https://github.com/Delgan/loguru Star 3048

    c46133f3c5285bc6edcb2331999402d5.png

    Loguru是一个Python日志记录库

    6

    Faust

    https://github.com/robinhood/faust Star 2733

    71aa1ee8f38e7cfea5374e318313932c.png

    Faust是一个流处理库,支持Python 3.6及以上版本

    7

    Pampy

    https://github.com/santinic/pampy Star 2399

    b388b7f70d2de58dc993c5f59c426a0a.png

    这是一个短小精干的Python模式匹配类库,只有150行代码,深的广大程序员喜爱

    8

    Pyre-check

    https://github.com/facebook/pyre-check Star 2242

    420039e496404b10e28f7bc7973f15db.png

    Python的静态类型检查器,由 Facebook提供。

    9

    delorean

    https://github.com/myusuf3/delorean Star 1519

    18f276143fc16642e100456914edce85.png

    DeLoreanjs(Delorean.js) 是极小的 Flux 模式实现,压缩后只有 4K

    10

    Cirq

    https://github.com/quantumlib/Cirq Star 1394

    8a5f894c2ceab6ff77f3f0c4765c3164.png

    Cirq 是 Google 专为 NISQ 算法打造的框架,允许开发者为特定的量子处理器编写量子算法。

    11

    Python-nubia

    https://github.com/facebookincubator/python-nubia Star 1032

    b459c25232f28e698066417b4f19e040.png

    一款命令行与交互式 shell框架 Nubia 是一款由 Python编写的,用于建立命令行应用的轻型框架,Facebook开发。

    12

    Requests-HTML

    https://github.com/kennethreitz/requests-html Star 8995

    ef905a465fde4ab1b734e5e687bad792.png

    这是一个解析解析HTML的Python库

    13

    Bokeh

    https://github.com/bokeh/bokeh Star 8943

    c9d5cd8e8f0057c822e398a4462ce4f1.png

    Bokeh是一个 Python 交互式可视化库,支持现代化 Web 浏览器,提供非常完美的展示功能。

    14

    Vibora

    https://github.com/vibora-io/vibora Star 4665

    b566680c4ff48e2b93571ef67f3ed87b.png

    Vibora 是一个 Python 异步网络框架(Python 3.6+),目前还处于 alpha 阶段。

    15

    Pywebview v2.0

    https://github.com/r0x0r/pywebview Star 1208

    4b00ec4e9f7ed4870be8591393a3910e.png

    pywebview 是一个轻量级跨平台的 HTML浏览器控件,可以在 GUI应用中显示 HTML内容。

    16

    WhatWaf

    https://github.com/Ekultek/WhatWaf Star 995

    d67168cea54f539df9a71a46ae0408ec.png

    检测并绕过Web应用程序防火墙和保护系统

    17

    Molten

    https://github.com/Bogdanp/molten Star 796

    a10639985515ee0bbf0be6bba4f91fbf.png

    Molten 是应用透明链路追踪工具。追踪php核心调用库运行时信息并且按照zipkin/optracing格式输出信息。

    18

    Termtosvg

    https://github.com/nbedos/termtosvg Star 7522

    804eb6db6d60af0b0c552699c22bd388.png

    termtosvg 是一个用 Python 编写的 Linux 终端记录器,可将你的命令行会话以独立的 SVG 动画呈现。

    19

    Asciinema v2.0

    https://github.com/asciinema/asciinema Star 6668

    356ceac0a7b1cb243e870c2ef26aea79.png

    Asciinema是一款Linux平台的轻便的终端录制与分享工具。

    20

    Termgraph

    https://github.com/mkaz/termgraph Star 2005

    d00b11810085a161051cbbaec8fdc961.png

    一个python命令行工具,用于在终端中绘制基本图表

    21

    Black

    https://github.com/ambv/black Star 7629

    5d6bd0a799896a7ee762cbd5f4834e0e.png

    Python 代码格式化工具

    22

    Algojammer

    https://github.com/ChrisKnott/Algojammer Star 2750

    da3e16d8edc495297286ca9d013490be.png

    这是一个用Python编写算法验证代码的编辑器

    23

    Bowler

    https://github.com/facebookincubator/bowler Star 879

    ec1e82bb26cc78210575c6f1c1a1c4be.png

    用于语法树级别的 Python代码重构工具,可实现安全的大规模代码修改,同时也能保证生成的代码可以编译和运行。

    24

    Py-spy

    https://github.com/benfred/py-spy Star 3479

    1a881d977f95419d0eeb1e9eb2e444bb.png

    Py-Spy 是一款 Python应用采样分析器,允许在不重启和修改代码的情况下,可视化你的 Python项目

    25

    Birdseye

    https://github.com/alexmojaki/birdseye Star 1068

    d288a2834f2bbb3add1580cad1d8b288.png

    Python可视化调试工具

    26

    Icecream

    https://github.com/gruns/icecream Star 728

    c239ee5169a810c4a0f9f046c1d707c3.png

    甜甜的,奶油般柔滑的打印调试

    27

    Transcrypt

    https://github.com/qquick/Transcrypt Star 1561

    57910a4d9f2c5b2d64d42adfffcce1e2.png

    Transcrypt 是一个用来将 Python 脚本转成 JavaScript 脚本的工具。

    28

    Pyodide

    https://github.com/iodide-project/pyodide Star 1041

    e864ddf14627dd75fc15ba6d65df4bf7.png

    编译成WebAssembly的Python科学栈。

    29

    Voluptuous

    https://github.com/alecthomas/voluptuous Star 1368

    是一个Python数据验证库

    30

    Botflow

    https://github.com/kkyon/botflow Star 933

    58ad5f8690038ce88b6ebca0b25556df.png

    一个Facebook出品的现代Python项目的安全代码重构

    31

    Fast-Pandas

    https://github.com/mm-mansour/Fast-Pandas Star 798

    4a43704eec08b5f710abe4b2107070a3.png

    32

    pywonderland

    https://github.com/neozhaoliang/pywonderland Star 3172

    一个用于绘制热力图的Python库

    33

    Chartify

    https://github.com/spotify/chartify Star 1817

    581e766f0c60ab73c9221ae022f29b6f.png

    是一个Python库,使数据开发者可以轻松创建图表的工具。

    34

    Hypertools v0.5

    https://github.com/ContextLab/hypertools Star 1353

    8b1ad0ad4be6d779a0e817007404785c.png

    这是一个基于 Python的高维数据降维以及可视化处理工具。

    展开全文
  • 代码

    2019-09-22 13:44:45
    使用vs2010读代码有几个工具 类图 序列图 调用层次 类图 体现了类之间的关系 类的方法属性也很容易找到 序列图 进入一个类的方法 看方法用了哪些其他的对象 调用顺序是什么样的 调用层次 看方法被什么方法调用过 ...

    使用vs2010读代码有几个工具 类图 序列图 调用层次 类图 体现了类之间的关系 类的方法属性也很容易找到 序列图 进入一个类的方法 看方法都用了哪些其他的对象 调用顺序是什么样的 调用层次 看方法被什么方法调用过 调用过什么方法 被什么方法重写过 这些可以用来理解代码 可以用来重构代码 还用一些比较平常的 转到定义 查找引用...,听说以后js代码也可以转到定义了.

    转载于:https://www.cnblogs.com/frog2008/archive/2011/12/30/2307074.html

    展开全文
  • 你在实际开发中,有哪些手机架构与性能调试经验 刚接手公司的旧项目时,模块特别多,而且几乎所有的代码都写在控制器里面,比如UI控件代码、网络请求代码、数据存储代码 接下来采取MVC模式进行封装、重构 ...

    李洪强iOS经典面试题141-报错警告调试

     

    报错警告调试

    你在实际开发中,有哪些手机架构与性能调试经验

    • 刚接手公司的旧项目时,模块特别多,而且几乎所有的代码都写在控制器里面,比如UI控件代码、网络请求代码、数据存储代码
    • 接下来采取MVC模式进行封装、重构
      • 自定义UI控件封装内部的业务逻辑
      • 封装网络请求工具类(降低耦合)
      • 封装数据存储工具类

    BAD_ACCESS在什么情况下出现?

    这种问题是经常遇到的,在开发时经常会出现BAD_ACCESS。原因是访问了野指针,比如访问已经释放对象的成员变量或者发消息、死循环等。

    如何调试BAD_ACCESS错误?

    出现BAD_ACCESS错误,通常是访问了野指针,比如访问了已经释放了的对象。快速定位问题的步骤有:
    1.    重写对象的respondsToSelector方法,先找到出现EXECBADACCESS前访问的最后一个object
    2.    设置Enable Zombie Objects
    3.    设置全局断点快速定位问题代码所在行,接收所有的异常
    4.    Xcode7已经集成了BAD_ACCESS捕获功能:Address Sanitizer,与步骤2一样设置
    5. analyze也行(不一定管用)

    什么时候会报 unrecognized selector 异常?

    • 当调用对象(子类,各级父类)中不含有对应方法的时候,并且依旧没有给出“消息转发”的具体方案的时候,程序在运行时会crash并抛出 unrecognized selector 异常

    • objective-c 中的每个方法在运行时会被转为消息发送objc_msgSend(reciver, selector)

    • 例如 [person say]就会被转化为 objc_msgSend(person, @selector(say))

    • 运行时会根据对象(reciever) 的isa 指针找到该对象所对应的类,然后会依次在对应的类,父类,爷爷类,根类中找对应的方法

    下面只讲述对象方法的解析过程:

    • 第一步:+ (BOOL)resolveInstanceMethod:(SEL)sel实现方法,指定是否动态添加方法。若返回NO,则进入下一步,若返回YES,则通过class_addMethod函数动态地添加方法,消息得到处理,此流程完毕。
    • 第二步:在第一步返回的是NO时,就会进入- (id)forwardingTargetForSelector:(SEL)aSelector方法,这是运行时给我们的第二次机会,用于指定哪个对象响应这个selector。不能指定为self。若返回nil,表示没有响应者,则会进入第三步。若返回某个对象,则会调用该对象的方法。
    • 第三步:若第二步返回的是nil,则我们首先要通过- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector指定方法签名,若返回nil,则表示不处理。若返回方法签名,则会进入下一步。
    • 第四步:当第三步返回方法方法签名后,就会调用- (void)forwardInvocation:(NSInvocation *)anInvocation方法,我们可以通过anInvocation对象做很多处理,比如修改实现方法,修改响应对象等
    • 第五步:若没有实现- (void)forwardInvocation:(NSInvocation *)anInvocation方法,那么会进入- (void)doesNotRecognizeSelector:(SEL)aSelector方法。若我们没有实现这个方法,那么就会crash,然后提示打不到响应的方法。到此,动态解析的流程就结束了。

    有哪些常见的 Crash 场景?

    • 访问了僵尸对象
    • 访问了不存在的方法
    • 数组越界
    • 在定时器下一次回调前将定时器释放,会Crash

    lldb(gdb)常用的调试命令?

    •    p 输出基本类型//p (int)[[[self view] subviews] count]
    •    po 用于输出 Objective-C 对象//po [self view]
    •    expr 可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。//源代码中 a = 1 ;expr a=2 输出结果:(int) $0 = 2

    如果一个函数10次中有7次正确,3次错误,问题可能出现在哪里?

    这样的问题通过应聘者的分析,可以知道应聘者的功底如何。很多人的回答会是很简单的,没有从多方面去分析。这样的问题也是很有意义的,在项目开发中所产生的bug,有的时候会出现这样的情况,而代码量比较大且业务比较复杂时,通过其他工具并不能分析出来是什么bug,但是我们却可以根据出现的频率推测。笔者把这个问题当作测试部反馈过来的bug描述问题来分析一下。
    参考答案:
    从问题描述可知,bug不会必现的,因此无法直接定位出错之处。从以下角度出现来分析可能出错之处:
    1.    因出错并不是崩溃,因此没有错误日志可看。第一步就是分析函数中的所有分支,是否在语法上存在可能缺少条件的问题。所以,检查所有的分支,确保每个分支执行的结果的正确的
    2.    检测函数的参数,保证必传参数不能为空,若为空应该抛出异常。因此,用断言检测参数的正确性是很重要的。
    3.    检测函数中每个分支所调用的函数返回结果是正确的,其实就是一个递归的过程(步骤1、2)

    你一般是如何调试Bug的?

    这个问题看起来很笼统,但又一针见血。通过应聘者的回答,可很直观地看出这个应聘者的处理bug的能力,以及其解决问题的思维。
    参考答案:
    Bug分为测试中的Bug和线上的Bug:
    •    线上Bug:项目使用了友盟统计,因此会有崩溃日志,通过解析dYSM可以直接定位到大部分bug崩溃之处。解决线上bug需要从主干拉一个新的分支,解决bug并测试通过后,再合并到主干,然后上线。若是多团队开发,可以将fix bug分支与其他团队最近要上线的分支集成,然后集成测试再上线。
    •    测试Bug:根据测试所反馈的bug描述,若语义不清晰,则直接找到提bug人,操作给开发人员看,最好是可以bug复现。解决bug时,若能根据描述直接定位bug出错之处,则好处理;若无法直观定位,则根据bug类型分几种处理方式,比如崩溃的bug可以通过instruments来检测、数据显示错误的bug,则需要阅读代码一步步查看逻辑哪里写错。
    对于开发中出现的崩溃或者数据显示不正常,那就需要根据经验或者相关工具来检测可能出错之处。当然,团队内沟通解决是最好的。

    获取一台设备唯一标识的方法有哪些?

    • 现在常用的是用UUID + keychain结合来实现这个需求。

    • UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。

    //获取一个UUID
     - (NSString*)uuid {
        CFUUIDRef uuid = CFUUIDCreate( nil );
        CFStringRef uuidString = CFUUIDCreateString( nil, uuid );
        NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
        CFRelease(uuid);
        CFRelease(uuidString);
        return result;
    }
    • 现在我们获取到了一个UUID,虽然这个标识是唯一的,但是这样还是无法保证每一次的唯一性,因为当你每次调用这个方法或者把应用卸载了,UUID会重新生成一个不同的。这个时候keychain就起到了作用。
    • 所以整个逻辑是这样的:先从keychain取UUID,如果能取到,就用这个比对,如果取不到就重新生成一个保存起来。keychain独立在App之外,是和系统统一等级的,所以你不用担心它挂掉。
    • keychain是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中被导入,并且包括在了所有后续的Mac OS版本中,包括Mac OS X。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。iOS端同样有个keychain帮助我们管理这些敏感信息。

    • 使用过keychain保存过账号密码的童鞋应该对这个工具非常了解,在这里不做过多解释。使用keychain需要导入Security.framework和KeychainItemWrapper.h/.m,KeychainItemWrapper.h/.m搜一下可以下载下来,拖入工程中。保存UUID代码如下:

    - (void)saveUuidWithKeyChain {
        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                             initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
        NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
        if (strUUID == nil || [strUUID isEqualToString:@""])
        {
            [keychainItem setObject:[self uuid] forKey:(id)kSecValueData];
        }
    }
    注:这个方法中accessGroup:这个参数如果一些App设置相同的话,是可以共享的。
    • 从keychain获取UUID的方法如下:
    - (NSString *)getKeychain {
        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                             initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
        NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
        return strUUID;
    }
    • 至此,基本上唯一标识的几个方法算是写完了,大家可以测试一下,卸载应用再重新装,从keychain读取的UUID还是和之前一样。

    • 但这里有个不确定因素,就是手机系统恢复出厂设置或者抹掉所有数据的话,这个方法也可能不起作用了,因为它是依靠钥匙串在生存,钥匙串挂掉的话它也就失效了。

    你一般是怎么用 Instruments 的?

    • 这个问题也就是考察下你经验如何了, Instruments里面工具很多,也没必要逐一说明,挑几个常用的说下就好

    • 参考答案:

    • Time Profiler:性能分析
    • Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能
    • Allocations:用来检查内存,写算法的那批人也用这个来检查
    • Leaks:检查内存,看是否有内存泄露

    你一般是如何调试 Bug 的?

    • 查看异常报告
    • 配置相关环境,重现bug
    • 代码检查
    • 用测试案例来捕获bug
    • 可以请同事一同来审查问题,有些时候当局者迷,旁观者清。

    如何对iOS设备进行性能测试?

    Profile-> Instruments ->Time Profiler 进行性能测试!

    测试iOS版的 App 注意事项分享以下几点:

    1.app使用过程中,接听电话。可以测试不同的通话时间的长短,对于通话结束后,原先打开的app的响应,比如是否停留在原先界面,继续操作时的相应速度等。

    2.app使用过程中,有推送消息时,对app的使用影响

    3.设备在充电时,app的响应以及操作流畅度

    4.设备在不同电量时(低于10%,50%,95%),app的响应以及操作流畅度

    5.意外断电时,app数据丢失情况

    6.网络环境变化时,app的应对情况如何:是否有适当提示?从有网络环境到无网络环境时,app的反馈如何?从无网络环境回到有网络环境时,是否能自动加载数据,多久才能开始加载数据

    7.多点触摸的情况

    8.跟其他app之间互相切换时的响应

    9.进程关闭再重新打开的反馈

    10.IOS系统语言环境变化时

    文章如有问题,请留言,我将及时更正。

     

    转载于:https://www.cnblogs.com/LiLihongqiang/p/6027822.html

    展开全文
  • 消除技术债务比较好的手段有哪些? 如何向产品团队的人解释偿还技术债的重要性及相关的工作量? 详细介绍一个系统或业务做得比较好的组织的沟通方式和组织结构? 怎么将非一流个体打造成一流团队? 在保证质量和进度...
  • php高级开发教程说明

    2008-11-27 11:39:22
    他们都有自己 偏爱的语言(也许是公司指定的一种语言),了解它的优点和它的缺点,并根据语言的具体特点 修正项目。但当克服所选语言的缺陷时,就可能会增加不必要的额外工作。 了解如何使用一门语言却缺乏其特定的...
  • 由于是翻译过来的,书中有些例子可能听起来比较奇怪,貌似翻译过来的技术书都有这个问题。 《设计模式-可复用面向对象软件的基础》 又是一本黑色大部头书,书的作者就是 GoF,大家都说经典。但是呢,经典归经典,...
  • 8.3.2 非分布式PL/SQL代码块中的COMMIT 249 8.4 完整性约束和事务 250 8.4.1 IMMEDIATE约束 251 8.4.2 DEFERRABLE约束和级联更新 251 8.5 不好的事务习惯 255 8.5.1 在循环中提交 255 8.5.2 使用自动提交 261...
  • 每种方法都有可取之处,但我相信,真正的学习应该是“参考+实践”。盲目实践会频繁遇到本来可以避免的陷阱和失败,耽于参考又会成为纸上谈兵,无法得到真才实学。 学习Oracle时,很多书和资料都很有参考价值,特别...
  • DOClever有哪些功能 1.可以对接口信息进行编辑管理,支持get,post,put,delete,patch五种方法,支持http和https协议,并且支持query,body,json,raw,rest,formdata的参数可视化编辑。同时对json可以进行无限层次...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    不要为每个事物画一个模型,应该把精力放在关键的领域 对象图 对象图 表示在某一时刻类的具体实例和这些实例之间的具体连接关系 类 与 对象 关系 类 与 对象 关系 类图和对象图的区别 包 包 一种分组...
  • 新手学习 Java,有哪些 Java 相关的博客,专栏,和技术学习网站推荐? Java 还是大数据,你需要了解这些东西! 书单 「基础篇」Java 书单 其他 贡献者 你可以点此链接查看JavaGuide的所有贡献者。 感谢你们让...
  • 新手学习 Java,有哪些 Java 相关的博客,专栏,和技术学习网站推荐? Java 还是大数据,你需要了解这些东西! 书单 「基础篇」Java 书单 其他 贡献者 你可以点此链接查看JavaGuide的所有贡献者。 感谢你们让...
  • 新手学习 Java,有哪些 Java 相关的博客,专栏,和技术学习网站推荐? Java 还是大数据,你需要了解这些东西! 书单 「基础篇」Java 书单 其他 贡献者 你可以点此链接查看JavaGuide的所有贡献者。 感谢你们让...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    34. 你所知道的集合类都有哪些?主要方法? 13 35. 描述一下JVM加载class文件的原理机制? 13 36. char型变量中能不能存贮一个中文汉字?为什么? 13 37. 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 13 38. XML文档...
  • </a></li><li><a href="https://github.com/react-china/collections/issues/2">都有谁在用 React 呢?</a></li><li><a href="https://github.com/dingyiming/learn-Js-react/issues/1">【资料汇总】React</a></li>...
  • spm3 发布日志

    2020-11-23 05:53:29
    这些前端模块化的方案和工具都致力于解决一个问题:我们如何可以像 npm 一样方便的组织和调用模块,我们如何最小成本地来使用和贡献业界优秀的模块,我们如何能给开发者提供通用的前端模块化解决...
  • stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编程书籍索引 中文版 如果这个仓库对你有帮助,欢迎 star。如果这个仓库帮你提升了技能找到了工作,可以请我喝杯咖啡: ...
  • 2018 年终总结

    2020-12-26 16:13:19
    所以每个人基本都有机会去负责一件事情,那就能锻炼每个人的 owner 意识。 对于我来说,也因这个机会能够在新团队发挥作用,去做一些之前没机会尝试的事。 <ul><li>一个是国际化 mis-portal 的...
  • 优化框架代码,解决已知Bug; 新增ViewPager+Fragment例子; 新增RecycleView多布局例子; 升级第三方依赖库; 修改文档说明。 更多日志 AndroidX分支 注:1.x-废弃版(最后版本:1.2.6.1)、2.x-顺手版(最后...
  • wxPython学习手册

    热门讨论 2014-04-19 08:01:58
    12.3.4 预定义的颜色名有哪些? 392 12.4 本章小结 392 第三部分 高级wxPython 394 13 建造列表控件并管理项目 395 13.1 建造一个列表控件 395 13.1.1 什么是图标模式? 396 13.1.2 什么是小图标模式? 397 13.1.3 ...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、制造商、独立软件生产商可以获得不错的利 益 。 将移动终端的评价标准从硬件向软件转变,极大的激发了软件开发者的热情。 � Android 的源代码遵循 Apache...
  • WEB开发者应该有哪些必备的技能?.epub Web性能优化与HTTP-2.epub Web版Rss阅读器.epub WEB重构之道.epub Web项目开发规范文档.epub Werkzeug中文文档.epub XORM操作指南.epub Yet Another Scheme 入门教程.epub Yii...
  • WEB开发者应该有哪些必备的技能?.epub Web性能优化与HTTP-2.epub Web版Rss阅读器.epub WEB重构之道.epub Web项目开发规范文档.epub Werkzeug中文文档.epub XORM操作指南.epub Yet Another Scheme 入门教程.epub Yii...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

代码重构工具都有哪些