Git 源码禁止使用 C 标准库中容易被错用的函数

by admin on 2020年2月14日

Git 项目的源码禁止开发者使用 C
标准库中的某些函数,原因是这些函数太容易被误用,就算使用得当也很容易出问题。因此
Git 的源码增加了一个 banned.h
的头函数,一旦你使用了这些被禁用的函数,将在编译时报错。

1.block底层原理
闭包(block),闭包就是能够读取其它函数内部变量的函数
Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。
一个 block 实际是一个对象,它主要由一个 isa 和 一个 impl 和 一个
descriptor 组成。
2.百度地图基本API

背景

” Life is short, you need Python——Bruce Eckel ”
【人生苦短,我用Python】
于是我参加了网易云课堂的《程序设计入门—Python》课程,网易云课堂的课程是必须在开课时间内完成的,记得当时参加的是第四次开课,刚开课不久由于工作上太忙而终止了学习。

Zoom.Quiet :用最短时间刷得最核心的 20%
知识点,然后就别学了,直接来解决实际问题吧。千万别将一门开发语言,弄成一门学科来研究/深入。

根据大妈建议,最近休息在家,快速刷了一遍《笨办法学Python》第三版。

这些函数包括:

import <BaiduMapAPI_Map/BMKMapView.h>// 地图视图

开发环境

 #ifndef BANNED_H
#define BANNED_H

/*
 * This header lists functions that have been banned from our code base,
 * because they're too easy to misuse (and even if used correctly,
 * complicate audits). Including this header turns them into compile-time
 * errors.
 */

#define BANNED(func) sorry_##func##_is_a_banned_function

#undef strcpy
#define strcpy(x,y) BANNED(strcpy)
#undef strcat
#define strcat(x,y) BANNED(strcat)
#undef strncpy
#define strncpy(x,y,n) BANNED(strncpy)
#undef strncat
#define strncat(x,y,n) BANNED(strncat)

#undef sprintf
#undef vsprintf
#ifdef HAVE_VARIADIC_MACROS
#define sprintf(...) BANNED(sprintf)
#define vsprintf(...) BANNED(vsprintf)
#else
#define sprintf(buf,fmt,arg) BANNED(sprintf)
#define vsprintf(buf,fmt,arg) BANNED(sprintf)
#endif

#endif /* BANNED_H */

import <BaiduMapAPI_Location/BMKLocationService.h> //定位服务

Cmder

本次的学习,计划把源码托管在
GitHub
上。在开始学习Python前,先刷了一遍廖雪峰老师的
Git教程
。大致了解了Git的基本原理和常用的Git命令。

Cmder Full版本内置MsysGit工具,这是Git for
Windows的标准配备;全安装版Cmder 自带了 MsysGit, 除了 Git
本身这个命令之外, 里面可以使用大量的 Linux 命令。这里主要用到Git SSH
Key生成
ssh-keygen -t rsa -C "jeetchan@qq.com"
。用SSH连接GitHub。需要注意的是,用Cmder内置的Git工具,请设置
Path环境变量,如我的是 D:Programcmdervendorgit-for-windowsbin

banned.h 源码  

import <BaiduMapAPI_Search/BMKPoiSearch.h>//Poi搜索附近

Visual Studio Code

我的上一篇文章 Python基础 0 Hello
World!
所用环境为Spyder,但考虑到《笨办法学Python》中的建议,不用IDE,(用Notepad++和PowerShell)
以及要用Git进行版本管理,决定改为Visual Studio Code,Visual Studio
Code集成Git,GitUI,无需再用GitKraken等其他工具,也可配置PowerShell终端。

(文/开源中国)    

import <BaiduMapAPI_Map/BMKAnnotation.h>//标注点的protocol

学习小结

本次学习,完成了前42个练习,一直下来倒也没遇到什么大问题。另外,
《笨办法学Python》第三版是基于Python2的,我本次的练习用了Python3,源码由Python2改为Python3,练习中的源码全部运行通过。

import <BaiduMapAPI_Map/BMKPointAnnotation.h>//定位点的泡泡

本书中Python2和Python3中的不同

  • print 在Python3中是函数,print
    默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=” “:

print(var1,var2,end=" ")

格式化可在字符串前加’f’:

print(f"So, you're {age} old, {height} tall and {weight} heavy.")

raw_input() 函数在Python3中改为input()

import <BaiduMapAPI_Map/BMKPinAnnotationView.h>//提供类似大头针效果的annotation view

3.内存泄漏的情况下如何调试
1.打开XCode的选项:NSZombieEnabled 僵尸模式(打包时要取消)
2.用XCode的Analyze就能分析到哪里有内存泄露
3.使用Instruments的leaks工具分析使用中出现的内存泄漏
4.什么情况下会使用GCD
(GCD)是Apple开发的一个多核编程的解决方法,在多线程中使用比较多。在网络请求及复杂耗时操作时使用。
5.git和svn的区别
最核心的区别Git是分布式的,而Svn不是分布的。
Git把内容按元数据方式存储,而SVN是按文件。
Git没有一个全局版本号,而SVN有
Git的内容的完整性要优于SVN
Git下载下来后,在OffLine状态下可以看到所有的Log,SVN不可以
SVN的特点是简单,只是需要一个放代码的地方时用是OK的。
Git的特点版本控制可以不依赖网络做任何事情,对分支和合并有更好的支持
5.如何使用block代替target…action
创建分类UIButton+targetBlock 扩展action
6.iOS数据缓存
1.直接写文件方式
2.NSUserDefaults
3.归档操作
4.coreData
5.FMDB
7.谈谈你对响应者链的认识
在IOS中,有响应者链对事件进行响应,所有的响应类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会。
8.Runtime机制有没有深入了解过
runtime 是 OC底层的一套C语言的API(引入
或),编译器最终都会将OC代码转化为运行时代码,通过终端命令编译.m
文件:clang -rewrite-objc xxx.m可以看到编译后的xxx.cpp(C++文件)。
比如我们创建了一个对象 [[NSObject
alloc]init],最终被转换为几万行代码,截取最关键的一句可以看到底层是通过runtime创建的对象
利用runtime 可以做一些OC不容易实现的功能
动态交换两个方法的实现(特别是交换系统自带的方法)
动态添加对象的成员变量和成员方法
获得某个类的所有成员方法、所有成员变量
9.怎么在手机主界面显示控制app里的音频,更改音量,上一曲下一曲
1.更改音量,有系统的API
2.上下曲的逻辑写在AudioController的音频播放控制单例里的,播放时传入的列表
并记录当前播放的index,上下曲目更换index并从播放数组取audio传入播放类进行播放。
10.使用xib或者stotyboard代码合并的时候遇到冲突是什么样的,怎么解决
http://blog.csdn.net/yuanyuan1314521/article/details/49836381
11.你是怎么使用FMDB的
FMDB是一种第三方的开源库,FMDB就是对SQLite的API进行了封装,加上了面向对象的思想
一 项目中添加libsqlite3库的依赖
导入FMDB源码:
下载FMDB的源代码,将代码文件拖入工程
#import导入FMDB的头文件”FMDatabase.h”
二、FMDB使用
使用FMDB前,需要先了解下3个主要类:
FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。
FMResultSet :执行查询一个FMDatabase结果集。
FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类。
一般的FMDB数据库操作有:
创建数据库
打开数据库、关闭数据库
执行更新的SQL语句
执行查询的SQL语句
12.GCD和NSOperation的关系,有什么区别
1.GCD的核心是C语言写的系统服务,执行和操作简单高效,因此NSOperation底层也通过GCD实现,换个说法就是NSOperation是对GCD更高层次的抽象,这是他们之间最本质的区别.因此如果希望自定义任务,建议使用NSOperation;
2.依赖关系,NSOperation可以设置两个NSOperation之间的依赖,第二个任务依赖于第一个任务完成执行,GCD无法设置依赖关系,不过可以通过dispatch_barrier_async来实现这种效果;
3.KVO(键值对观察),NSOperation和容易判断Operation当前的状态(是否执行,是否取消),对此GCD无法通过KVO进行判断;
4.优先级,NSOperation可以设置自身的优先级,但是优先级高的不一定先执行,GCD只能设置队列的优先级,无法在执行的block设置优先级;
5.继承,NSOperation是一个抽象类实际开发中常用的两个类是NSInvocationOperation和NSBlockOperation,同样我们可以自定义NSOperation,GCD执行任务可以自由组装,没有继承那么高的代码复用度;
6.效率,直接使用GCD效率确实会更高效,NSOperation会多一点开销,但是通过NSOperation可以获得依赖,优先级,继承,键值对观察这些优势,相对于多的那么一点开销确实很划算,鱼和熊掌不可得兼,取舍在于开发者自己;
13.微信支付接入流程
一、 填写商户平台所需资料
二、创建一个项目
三、下载微信终端SDK文件
SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。
请前往“资源下载页”下载最新SDK包
摘自http://www.jianshu.com/p/af8cbc9d51b0

中文乱码

‘习题5’

Warning
如果你使用了非 ASCII 字符而且碰到了编码错误,记得在最顶端加一行 # –
coding: utf-8
– 。

由于我用的是Python3,并没有出现编码错误问题,而在’习题 15:
读取文件’中,open()
方法在读取中文时发生编码错误,指定编码即可:open(filename, mode='r', encoding='UTF-8')

代码缩进

Python代码缩进是非常严格的,python最具特色的就是使用缩进来表示代码块,不需要使用大括号({})。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。由’习题
18: 命名、变量、代码、函数’起就能明显感受到严格的缩进检查了,’习题 26:
恭喜你,现在可以考试了!’中很多错误也是由缩进造成。本练习中的’常见问题回答’还指出了一个很有用的解决问题方法:

我可以边修正代码边运行吗?
当然可以。这样的事情就是要计算机帮忙,多多益善。

展望

  • 刷Django

  • 应用,直接来解决实际问题

参考

廖雪峰:Git教程

利用win10 bash + cmder
搭建最顺手的前端开发环境

用VSCode写python的正确姿势

Visual Studio Code
使用Git进行版本控制

Zoom.Quiet:极简 Python
上手导念

《笨办法学Python》
第0课手记

在线手册

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图