您的位置:首页 > 其它

9.9 学习日记

2016-09-05 11:04 134 查看
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 

    //获得最后一个目录并且把他
9381
删除,然后返回一个新的路径 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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: