9.9 学习日记
来源:互联网 发布:如何上传淘宝宝贝图片 编辑:程序博客网 时间:2024/06/03 08:18
1.NSAssert
NSAssert(x!=0,@”x must not be zero”);
在表达式“x!=0”不成立时,程序就会抛出异常,并显示自定义的消息”x must not be zero”,并同时显示出错的文件、代码和调用函数等信息.
2.数据库相关
//dbPath: 数据库路径,在Document中。
NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"Test.db"];
//创建数据库实例 db 这里说明下:如果路径中不存在"Test.db"的文件,sqlite会自动创建"Test.db"
db= [FMDatabase databaseWithPath:dbPath] ;
//为数据库设置缓存,提高查询效率
[db setShouldCacheStatements:YES];
/ 1.创建一个表 表的名字
[self creatTable];
//2.向表中添加数据
[self insertData:@"草帽" age:23];
//3.查看结果
[self ResultSet];
//创建表的时候 最好判断下自己的之前的工作有么有做好
if (![db open]) {
[db open];
}
//判断是否存在这张名字为User的表 如果没有 创建
if (![db tableExists:@"User"]) {
//创建一个名为User的表,有两个字段分别为string类型的Name,integer类型的 Age
[db executeUpdate:@"CREATE TABLE User (Name text,Age integer)"];
}
//插入数据使用OC中的类型 text对应为NSString integer对应为int的整型
[db executeUpdate:@"INSERT INTO User (Name,Age) VALUES (?,?)",name,[NSNumber numberWithInt:age]];
//返回数据库中第一条满足条件的结果
NSString *aa=[db stringForQuery:@"SELECT Name FROM User WHERE Age = ?",@"20"];
NSLog(@"aa is %@",aa);
FMResultSet *rs=[db executeQuery:@"SELECT * FROM User"];
// rs=[db executeQuery:@"SELECT * FROM User WHERE Age = ?",@"23"];
while ([rs next]){
NSLog(@"%@ %@",[rs stringForColumn:@"Name"],[rs stringForColumn:@"Age"]);
}
[rs close];
//修改表内容
-(void)Modify
{
[db executeUpdate:@"UPDATE User SET Name = ? WHERE Name = ? ",@"李四",@"张三"];
}
3.NSDateFormatter就相当于是NSDate的转换类,将NSDate转换为另一种格式,或转换回来。NSDate没有自己的输出,需要借助NSDateFormatter以相应格式输出。这差不多就是NSDateFormatter的作用了吧。
//实例化一个NSDateFormatter对象
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//设定时间格式,这里可以设置成自己需要的格式
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//用[NSDate date]可以获取系统当前时间
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
//输出格式为:2010-10-27 10:22:13
NSLog(@”%@”,currentDateStr);
4.DES加密
//DES算法
static Byte iv[] = {1,2,3,4,5,6,7,8};
+(NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key{
NSString * ciphertext = nil;
NSData * textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [textData length];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, [textData bytes], dataLength, buffer, 1024, &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData * data = [NSData dataWithBytes:buffer length:(NSInteger)numBytesEncrypted];
ciphertext = [GTMBase64 stringByEncodingData:data];
}
return ciphertext;
}
//DES算法加密udid
+(NSString *)buildCreateSessionParam{
NSMutableDictionary * configDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:EE_ZumeSysConfig_Path];
NSString * desKey = [configDictionary objectForKey:@"desKey"];
NSDate * date = [NSDate dateWithTimeIntervalSinceNow:0];
NSString * timestamp = [NSString stringWithFormat:@"%ld",(long)[date timeIntervalSince1970]];
NSString * vendorUDID = [DeviceInfo getVendorUDID];
NSLog(@"创建session参数,desKey:%@",desKey);
NSLog(@"创建session参数,vendorUDID:%@",vendorUDID);
NSLog(@"创建session参数,timestamp:%@",timestamp);
NSString * data = [[[ZumeSysConfig getClientId] stringByAppendingString:@";"] stringByAppendingString:vendorUDID];
data = [DES encryptUseDES:data key:desKey];
return data;
}
5.#import <objc/runtime.h>
程序运行时可以在不修改源码的基础上增加方法;近排在看别人的开源代码时,发现还可以动态增加属性。
动态类的创建分为两步,添加 成员变量 需要在这两步操作之间,添加 成员方法 则无此要求
1. Class objc_allocateClassPair(Class superClass,const char* className,size_t extraBytes);
2. void objc_registerClassPair(Class cls);
//block方法回调,这时候默认用self作为delegate
-(void)showAlertViewWithCompleteBlock:(CompleteBlock)block{
if (block) {
//移除所有关联
objc_removeAssociatedObjects(self);
/*
1.创建关联(源对象,关键字,关联的对象和一个关联策略)
2.关键字是一个void类型的指针,每一个关联的关键字比武时唯一的,太长都会采用静态变量作为关键字
3.关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的,关联的院子还是非原子的,这里的关联策略和声明属性是的很类似
*/
objc_setAssociatedObject(self, &key, block, OBJC_ASSOCIATION_COPY);
//设置delega
self.delegate = self;
}
[self show];
}
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
CompleteBlock block = objc_getAssociatedObject(self, &key);
if (block) {
//block传值
block(buttonIndex);
}
}
/*
OC中的关联就是在已有类的基础上添加对象参数。来扩展原有的类,需要引入#import <objc/runtime.h>头文件。关联是基于一个key来区分不同的关联。
常用函数: objc_setAssociatedObject 设置关联
objc_getAssociatedObject 获取关联
objc_removeAssociatedObjects 移除关联
*/
-----------------------------------------------
Class Test= objc_allocateClassPair([NSObject class], "Test", 0);
//为类添加变量
class_addIvar(Test, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
//为类添加方法
//IMP 是函数指针
// typedef id (*IMP)(id, SEL, ...);
IMP i = imp_implementationWithBlock(^(id this,id some){
NSLog(@"%@",some);
return @111;
});
//注册方法名为 test: 的方法
SEL s = sel_registerName("test:");
class_addMethod(Test, s, i, "i@:");
//结束类的定义
objc_registerClassPair(Test);
动态创建对象
采用上边代码创建的 Test 类创建对象,并通过该对象操作成员方法和成员变量
//创建对象
id t = [[Test alloc]init];
//KVC 动态改变 对象t 中的实例变量
[t setValue:@"张三" forKey:@"name"];
NSLog(@"%@",[t valueForKey:@"name"]);
//调用 t 对象中的 s 方法选择器对于的方法
id result = objc_msgSend(t, s,@"传送内容");
NSLog(@"%@",result);
运行结果
2014-08-15 00:11:00.239 Test[44644:303] 张三
2014-08-15 00:11:00.240 Test[44644:303] 传送内容
2014-08-15 00:11:00.241 Test[44644:303] 111
6.获取手机存储空间大小
+ (long long ) freeDiskSpaceInBytes{
struct statfs buf;
long long freespace = -1;
if(statfs("/var", &buf) >= 0){
freespace = (long long)(buf.f_bsize * buf.f_bfree);
}
return freespace/1024/1024;
//return [NSString stringWithFormat:@"手机剩余存储空间为:%qi MB" ,freespace/1024/1024];
}
7.UIDevice
UIDevice提供了多种属性、类函数及状态通知,帮助我们全方位了解设备状况。从检测电池电量到定位设备与临近感应,UIDevice所做的工作就是为应用程序提供用户及设备的一些信息。UIDevice类还能够收集关于设备的各种具体细节,例如机型及iOS版本等。其中大部分属性都对开发工作具有积极的辅助作用。下面的代码简单的使用UIDevice获取手机属性。
//设备相关信息的获取
NSString *strName = [[UIDevice currentDevice] name];
NSLog(@"设备名称:%@", strName);//e.g. "My iPhone"
NSString *strId = [[UIDevice currentDevice] uniqueIdentifier];
NSLog(@"设备唯一标识:%@", strId);//UUID,5.0后不可用
NSString *strSysName = [[UIDevice currentDevice] systemName];
NSLog(@"系统名称:%@", strSysName);// e.g. @"iOS"
NSString *strSysVersion = [[UIDevice currentDevice] systemVersion];
NSLog(@"系统版本号:%@", strSysVersion);// e.g. @"4.0"
NSString *strModel = [[UIDevice currentDevice] model];
NSLog(@"设备模式:%@", strModel);// e.g. @"iPhone", @"iPod touch"
NSString *strLocModel = [[UIDevice currentDevice] localizedModel];
NSLog(@"本地设备模式:%@", strLocModel);// localized version of model
8.[[UIScreen mainScreen] scale] == 2.0
对于scale属性需要做进一步的说明:
以前的iphone 设备屏幕分辨率都是320*480,后来apple 在iPhone 4中采用了名为Retina的显示技术,iPhone 4采用了960x640像素分辨率的显示屏幕。由于屏幕大小没有变,还是3.5英寸,分辨率的提升将iPhone 4的显示分辨率提升至iPhone 3GS的四倍,每英寸的面积里有326个像素。
scale属性的值有两个:
scale = 1; 的时候是代表当前设备是320*480的分辨率(就是iphone4之前的设备)
scale = 2; 的时候是代表分辨率为640*960的分辨率
9.字符串路径相关
/与路径相关的 void pathTest(){
//快速创建一个自动释放的数组 NSMutableArray *components=[NSMutableArray array]; //可变数组 [components addObject:@"Users"];
[components addObject:@"MJ"];
[components addObject:@"Desktop"];
//将数组中的所有字符串拼接成一个路径 NSString *path= [NSString pathWithComponents:components];
NSLog(@"%@",path);//拼接结果常用方法[1281:303] Users/MJ/Desktop
//将一个路径拆分成几个数组 NSArray *cmps=[path pathComponents];
NSLog(@"%@",cmps);
//判断是不是绝对路径
//判断依据就是在最前面是不是有斜杠“/” path=@"users/mj/test";
NSLog(@"%i",[path isAbsolutePath]);// 0
//查询最后一个文件夹 path=@"users/mj/test";
NSLog(@"最后一个目录:%@",[path lastPathComponent]);//最后一个目录:test
//获得最后一个目录并且把他删除,然后返回一个新的路径 path=@"users/mj/test";
NSLog(@"%@",[path stringByDeletingLastPathComponent]);//users/mj
//在路径的后面再拼接一个路径 NSLog(@"%@",[path stringByAppendingPathComponent:@"abc"]);//users/mj/test/abc
}
//拓展名处理 void exetension(){
NSString *str=@"/User/MJ/test.txt";
//判断拓展名 NSLog(@"拓展名:%@",[str pathExtension]);//拓展名:txt
//删掉拓展名 NSLog(@"%@",[str stringByDeletingPathExtension]);///User/MJ/test
//在字符串后面拼接一个拓展名 NSLog(@"%@",[@"abc"stringByAppendingPathExtension:@"mp3"]);//abc.mp3 }
- 9.9 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 【学习日记】
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- 学习日记
- Node.js+Wilddog 中复杂嵌套数据查询的异步处理同步返回数据问题
- Sqoop使用分析
- (15C++ for homework)Point&Line
- ECS Linux系统初始化后重新挂载数据盘
- mongo aggregate
- 9.9 学习日记
- Bat 自动更新脚本
- 我的爱情视角
- Complex Again
- jQuery固定表头
- Android Universal Image Loader 源码分析
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用
- Effective Modern C++ 条款29 假设移动操作是不存在的、不廉价的、不能用的
- mysql中char、varchar、text区别和存储范围