[super viewDidLoad]和[super viewDidUnload]的调用时机
在iPhone/iPad编程中,viewDidLoad方法用于在试图控制器中加载视图时的初始化处理
在《iPhone4与iPad开发基础教程》中出现过两种写法
第一种写法:
- (void)viewDidLoad {
[super viewDidLoad];
// 其他代码
}
第二种写法:
- (void)viewDidLoad {
// 其他代码
[super viewDidLoad];
}
不过,我觉得第一种写法更可取,先调用父类的加载代码,再进行自身的加载。
viewDidUnload方法用于在卸载视图时的释放资源处理,比如释放输出口、释放内存等
- (void)viewDidUnload {
// 释放代码,比如:self.xxx = nil;
[super viewDidUnload];
}
http://www.linuxidc.com/Linux/2012-08/68721.htm
这里(http://www.linuxidc.com/Linux/2012-08/68722.htm)写过了RSA非对称加密解密的交互方式,
其实数字签名也是RSA非对称加密,只不过用私钥加密的,再加上个hash摘要
CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互已经提到关于证书和私钥的数据以及对象获取,这里就不再重复讨论
1.openssl的签名及验证 void opensslSigner::sign(EVP_PKEY* evpKey,BYTE** signValue,unsigned int &signLen,BYTE* text,int textLen) { EVP_MD_CTX mdctx; //摘要算法上下文变量 if(evpKey == NULL) { printf("EVP_PKEY_new err\n"); return; } //以下是计算签名的代码 EVP_MD_CTX_init(&mdctx); //初始化摘要上下文 if(!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL)) //签名初始化,设置摘要算法 { printf("err\n"); EVP_PKEY_free(evpKey); return; } if(!EVP_SignUpdate(&mdctx,text,textLen)) //计算签名(摘要)Update { printf("err\n"); EVP_PKEY_free(evpKey); return; } if(!EVP_SignFinal(&mdctx,*signValue,&signLen,evpKey)) //签名输出 { printf("err\n"); EVP_PKEY_free(evpKey); return; } printf("消息\"%s\"的签名值是:\n",text); printByte(*signValue,signLen); printf("\n"); EVP_MD_CTX_cleanup(&mdctx); } void opensslSigner::verify(EVP_PKEY* evpKey,BYTE* text,unsigned int textLen,BYTE* signValue,unsigned int signLen) { ERR_load_EVP_strings(); EVP_MD_CTX mdctx; //摘要算法上下文变量 EVP_MD_CTX_init(&mdctx); //初始化摘要上下文 if(!EVP_VerifyInit_ex(&mdctx, EVP_md5(), NULL)) //验证初始化,设置摘要算法,一定要和签名一致 { printf("EVP_VerifyInit_ex err\n"); EVP_PKEY_free(evpKey); return; } if(!EVP_VerifyUpdate(&mdctx, text, textLen)) //验证签名(摘要)Update { printf("err\n"); EVP_PKEY_free(evpKey); return; } if(!EVP_VerifyFinal(&mdctx,signValue,signLen,evpKey)) { printf("verify err\n"); EVP_PKEY_free(evpKey); EVP_MD_CTX_cleanup(&mdctx); return; } else { printf("验证签名正确.\n"); } //释放内存 EVP_PKEY_free(evpKey); EVP_MD_CTX_cleanup(&mdctx); } 2.CryptoAPI的签名验证 依然是私钥的问题,没时间再去尝试导入私钥,暂且只写验证 因为也是RSA加密,所以同样要注意字节排列方式,具体看RSA加密的交互部分 void verify(HCRYPTPROV hProv,PCCERT_CONTEXT cert,BYTE* text,unsigned long len,BYTE* signValue,unsigned long signLen) { //反序与openssl一致 for(int i = 0 ; i < signLen / 2;i++) { BYTE temp = signValue[i]; signValue[i] = signValue[signLen - i - 1]; signValue[signLen - i - 1] = temp; } // 创建离散对象 HCRYPTHASH hHash = NULL; if(!CryptCreateHash( hProv, // 容器句柄 CALG_MD5, // 算法标识 NULL, // 算法使用的Key 0, // 算法标识 &hHash)) // 返回的HASH对象 { printf("CryptCreateHash error:0X%x.\n",GetLastError()); return; } // 计算数据摘要 if(CryptHashData(hHash, text, len, 0) == 0) { printf("CryptHashData error:0X%x.\n",GetLastError()); return; } if(cert == NULL) { printf("pCertContext == NULL:0X%x.\n",GetLastError()); return; } //获取公钥句柄 HCRYPTKEY hPubKey; if(!CryptImportPublicKeyInfo(hProv, cert->dwCertEncodingType, &cert->pCertInfo->SubjectPublicKeyInfo, &hPubKey)) { printf("CryptImportPublicKeyInfo error:0X%x.\n",GetLastError()); return; } //验证签名 if(!CryptVerifySignature(hHash, signValue, signLen, hPubKey, NULL, 0)) { printf("CryptVerifySignature error:0X%x.\n",GetLastError()); return; } cout << "sign verify successfully" << endl; }
百度统计发布的最新统计数据显示,自北京时间3月15日中午12点正式发布以来,IE 9.0正式版受到了国内网友的热烈欢迎。截止到北京时间3月22日24点,IE 9.0在国内市场占有率达到了0.42%,排在所有浏览器的第12位。与IE 9.0市场占有率不断上升相对应的是,微软旗下IE 6.0,IE 7.0,IE 8.0的市场占有率略有动荡,其中IE 6.0,IE 8.0的市场份额分别下降了0.78%,0.29%,IE 7.0的市场份额上升了0.22%。
微软表示,IE 9.0相对于IE7.0和IE 8.0性能更强,速度更快,页面更简洁,安全性更佳。有理由相信,随着更多的网友加入IE 9.0 新版浏览器的阵营,IE 9.0在未来会赢得更多的拥趸。
IE 9.0的正式发布引起了国内浏览器市场的轻微动荡。发布一周以来,国内浏览器TOP10的市场份额变化如下:
值得注意的是,国内的浏览器市场并非微软IE浏览器一家独大。最新的国内浏览器的市场份额情况如下:
国内浏览器排名前三的仍然是IE 6.0,360安全浏览器,IE 8.0,分别占到了市场份额的39.68%,18.57%,15.67%。微软凭借IE浏览器与操作系统绑定这一得天独厚的优势,仍然拿到了浏览器市场的 65.34%。在国产浏览器中,360安全浏览器以18.57%的市场份额稳坐头把交椅,也成为从微软旗下浏览器中杀出重围的唯一黑马。
随着IE 9.0正式加入浏览器阵营,IE 9.0是否能够帮助微软巩固优势,扩大市场份额,并引爆新一轮的浏览器大战,让我们拭目以待。