ios开发算法
❶ iOS 开发中都会使用哪些算法
很少需要自己来写算法和数据结构,基本的算法和数据结构都已经集成到库中了。但需要你了解各种算法和数据结构的不同,以便选择适当的库。比如各种排序、查找、字典、数组,是经常用到的。
假如连最基本的算法和数据结构的知识都没有,就算是写一些界面逻辑代码,也经常有性能问题。举个例子,有一个很大的消息列表按照时间排序,而有新的 20 条消息来了,有些人完全无意识地,将 20 条消息一条条依次在一个大数组前面逐个插入,这样就会引起数组的重复移动。这样的代码初看起来逻辑也正确,但就会很慢。
一个稍微严肃一点的 iOS 程序,经常用到三种语言,Swift 编写看得见的界面,C++ 编写看不见的底层,而 Objective-C 用于界面和底层之间的相互调用穿透。
但很多人理解的 iOS 开发,就仅仅只是界面、动画之类的看得见的东西。在界面之下有很多看不见的更深层的东西。这些就需要算法和数据结构知识。比如需要写一个绘图软件,照相磨皮软件,就涉及到图形算法。一个录音声音处理,就需要处理声音的波形。一个电子书软件就涉及到排版。一个类似 Flipboard 的内容聚合软件就涉及网页的抽取。
当然上述的很多算法和数据结构不需要自己来写,但假如完全没有这方面的知识,就算有库用了,但很可能连怎么使用也不会。比如最基本的图形学知识,矩阵都不知道,OpenGL 接口是不会用的。
❷ ios 中开发中用户信息中的加密方式有哪些
5.1 通过简单的URLENCODE + BASE64编码防止数据明文传输
5.2 对普通请求、返回数据,生成MD5校验(MD5中加入动态密钥),进行数据完整性(简单防篡改,安全性较低,优点:快速)校验。
5.3 对于重要数据,使用RSA进行数字签名,起到防篡改作用。
5.4 对于比较敏感的数据,如用户信息(登陆、注册等),客户端发送使用RSA加密,服务器返回使用DES(AES)加密。
原因:客户端发送之所以使用RSA加密,是因为RSA解密需要知道服务器私钥,而服务器私钥一般盗取难度较大;如果使用DES的话,可以通过破解客户端获取密钥,安全性较低。而服务器返回之所以使用DES,是因为不管使用DES还是RSA,密钥(或私钥)都存储在客户端,都存在被破解的风险,因此,需要采用动态密钥,而RSA的密钥生成比较复杂,不太适合动态密钥,并且RSA速度相对较慢,所以选用DES)
把相关算法的代码也贴一下吧 (其实使用一些成熟的第三方库或许会来得更加简单,不过自己写,自由点)。注,这里的大部分加密算法都是参考一些现有成熟的算法,或者直接拿来用的。
1、MD5
//因为是使用category,所以木有参数传入啦
-(NSString *) stringFromMD5 {
if(self == nil || [self length] == 0) {
return nil;
}
const char *value = [self UTF8String];
unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(value, strlen(value), outputBuffer);
NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
[outputString appendFormat:@"%02x",outputBuffer[count]];
}
return [outputString autorelease];
}
2、Base64
+ (NSString *) base64EncodeData: (NSData *) objData {
const unsigned char * objRawData = [objData bytes];
char * objPointer;
char * strResult;
// Get the Raw Data length and ensure we actually have data
int intLength = [objData length];
if (intLength == 0) return nil;
// Setup the String-based Result placeholder and pointer within that placeholder
strResult = (char *)calloc(((intLength + 2) / 3) * 4, sizeof(char));
objPointer = strResult;
// Iterate through everything
while (intLength > 2) { // keep going until we have less than 24 bits
*objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
*objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
*objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];
*objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];
// we just handled 3 octets (24 bits) of data
objRawData += 3;
intLength -= 3;
}
// now deal with the tail end of things
if (intLength != 0) {
*objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
if (intLength > 1) {
*objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
*objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];
*objPointer++ = '=';
} else {
*objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4];
*objPointer++ = '=';
*objPointer++ = '=';
}
}
// Terminate the string-based result
*objPointer = '\0';
NSString *rstStr = [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
free(objPointer);
return rstStr;
}
3、AES
-(NSData*) EncryptAES: (NSString *) key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
4、RSA
- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen = 128; // currently RSA key length is set to 128 bytes
void *cipher = malloc(cipherLen);
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);
NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
❸ 中高级IOS开发程序员要具备哪些能力和技能
一、数据加密必备技能-密码学
在网络加速发展的时代,数据安全已经是一个必不可少的技术课题。如何让用户数据、网络数据、内容数据安
全可靠,也是每个开发者需要深思并捍卫的。熟练掌握密码学原理,了解 MD5 算法、非对称、对称加密算法底 层实现,以及如何运用到项目开发中。让开发者实力捍卫数据安全!
1.密码的起源历史
2.Base 64 编码格式、散列函数
3.MD5 &加盐、HMAC加密
4.对称加密算法
5.RSA Openssl、数字签名
二、RunLoop
RunLoop是iOS和OS X中非常基础的一个概念,在开发中不常用,在面试中也几乎是都会问到的一个问题.对RunLoop的概念以及底层实现原理,都是我们应该要掌握的,并且要知道在开发中哪些地方可以使用到RunLoop。
1.能理解RunLoop概念
2.知道RunLoop的使用方式
3.RunLoop在开发中的使用
三、Runtime
OC 纵横 iOS 开发已经多年,但是我们真的了解他们?他到底是怎么样的一个底层原理?在使用上难道就真的只有
这样?我们该如何更加掌握这门语言的应用?另外 OC 能做到的 Swift 也能做到吗?
1.runtime 到底是什么
2.runtime 怎么运用
3.runtime 怎么运用
4.siwft 中如何使用runtime
四、SDWebImage源码的分析
在开发中, 为了提高工作的效率, 我们大都会引入很多的框架, 觉得只要能能完成自己的工作达到目的就行, 当然这没错,但是确忽略了很多好框架中的编程思想,和实现的逻辑, 只知道使用框架, 不知道它里面的精髓, 长远来说对我们的发展是不好的, 所以让我们从经典的框架开始学起,一起来学习SDWebImage的精髓.
1.SDWebImage的demo的分析
2.SDWebImage缓存的概念
3.下载超时和图片的格式区分
4.SDWebImage的清理机制和内存的监听
五、H264编码
扎克伯格说“视频是未来facebook社交的最重要的行为之一”。作为开发而言,我们应该了解视频如何做到编码。在直播平台编码的技术也是频频使用,让我们从业务层跨往视频编码底层的第一步。
1.了解直播项目的架构以及技术突破点;
2.视频组成原理
3.H264文件的结构
4.软编码和硬编码的区别以及应用场景
5.硬编码的原理
6.使用硬编码编码视频文件
7.H264解码的多种处理方式
六、AAC编码
直播、音视频项目已经是iOS 应用类的APP的中坚力量。解密音频编码过程,让开发者不在对编码讳莫如深。映客、全名K歌、网易云音乐等等知名APP都会用到的音频AAC编码方式。
1.了解声音从模拟信号到数字信号的原理
2.PCM编码解析
3.AAC编码原理
4.AAC文件的结构
5.音频在软编码FFmpeg 和 硬编码的区别
6.利用硬编码编码音频
7.捕获媒体数据,如何区分音视频数据
8.利用FFmpeg 合成 H264文件和AAC文件到MP4容器中
❹ 一个资深的iOS开发者需要掌握哪些技能
iOS开发能力
掌握(最好是精通)OC语言和runtime各种细节(读过相关的clang源码和runtime源码为佳)。精通基本的framework(Foundation,UIKit等,平时干活用得最多的)。掌握一些第三方的轮子,这个主要看你的工作经验和习惯,如果自己有搞过不错的轮子最好(这点可以看出你的经验,眼界和解决问题的能力。)
基础知识
学校里的那些经典课程(数据结构,算法,三大浪漫基础,各分支研究领域的基础课程),这些反正都是老生常谈了。。。不好好打基础只能书到用时方恨少了。即使做不到精通,至少应该了解各个基础知识的关系和入口点(知识体系结构),就像你写oo时建立的类层次结构。
学习能力
能根据自己的工作目标快速的调研、掌握、改进和山寨各种技术,并且能把各种相关知识点融合起来,产生新技术,推动技术发展。
搜索技能,其实很多人不知道自己要找什么和如何去找,到哪去找
提问技巧,能清晰的表达自己的意图,好让别人知道怎么帮你,请搜索“提问的艺术”
广义的开发能力
不仅限于iOS,要在技术上有所建树,还是需要开阔自己的眼界,从不同领域汲取营养,开阔眼界,所谓的全栈和跨界正是如此。
搞技术的人要有一颗“好奇心”。
工程能力
各种工具(VSC,CI,Issue Tracking,Testing,Profiling)使用,订制改进,开发。这些算加分项,合理使用可以有效提高开发效率。
需求能力,可理解,制定和改进各种技术需求,业务需求。
文档能力,各种文档和绘图工具,善于表达和总结,最好是多多分享,提高“知名度”和“影响力”
管理能力
管理自己,可以按自己得既定目标有条不紊的前进,遇到突发事件能按优先级调整并实施新计划。
管理团队,首先是三观端正,有一定的亲和力和影响力,能有效的和同事就问题进行商讨,有一定的说服能力,可以代领身边同事一起往正确的方向前进。
另外附上一张学习图,希望能够帮助你: