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中。
NSSt
ring *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 }


0 0
原创粉丝点击