iOS,非视图类方法
2016-11-14 14:26 帅不过三秒 阅读(371) 评论(0) 编辑 收藏 举报isKindOfClass //判断是否是这个类或者这个类的子类的实例
例:
[mystring isKindOfClass:[NSString class]]
isMemberOfClass //判断是否是这个类的实例
例:
[mystring isMemberOfClass:[NSString class]]
//防止提示被键盘遮挡,直接展示到最高
UIWindow *win=[[UIApplication sharedApplication].windows objectAtIndex:([UIApplication sharedApplication].windows.count-1)]; [win makeToast:@"发送消息内容超长,请分条发送。" duration:2 position:@"middle"];
//获取当前视图第一响应者
//获取当前视图第一响应者 UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
//当前app是活跃的在前台
[UIApplication sharedApplication].applicationState == UIApplicationStateActive;
//当前app在后台
[UIApplication sharedApplication].applicationState ==UIApplicationStateBackground;
//(加下面代码加到Appdelegate头部(类扩展),整个app就允许所有请求)
@implementation NSURLRequest(DataController) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host { return YES; } @end
//读取应用列表,看看有无权限获取;不越狱的机器没有这个权限来判定的
- (BOOL)isJailBreak { if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/" ]) { NSLog(@"该设备已越狱"); NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/" error:nil]; NSLog(@"applist = %@", applist); return YES; } NSLog(@"该设备未越狱"); return NO; }
//判断cydia的URL scheme确认是否越狱
- (BOOL)isJailBreak { if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) { NSLog(@"该设备已越狱"); return YES; } NSLog(@"该设备未越狱"); return NO; }
// 移除字符串换行符和空格 -(NSString*)removeSpaceAndLine:(NSString*)content{ // Scanner NSScanner *scanner = [[NSScanner alloc] initWithString:content]; [scanner setCharactersToBeSkipped:nil]; NSMutableString *result = [NSMutableString string]; NSString *temp; NSCharacterSet *newLineAndWhitespaceCharacters = [ NSCharacterSet whitespaceAndNewlineCharacterSet];// 去除空格 // Scan while (![scanner isAtEnd]) { //得到非换行非空格的字符 temp = nil; [scanner scanUpToCharactersFromSet:newLineAndWhitespaceCharacters intoString:&temp]; if (temp) [result appendString:temp]; // Replace with a space if ([scanner scanCharactersFromSet:newLineAndWhitespaceCharacters intoString:NULL]) { if (result.length > 0 && ![scanner isAtEnd]) // Dont append space to beginning or end of result [result appendString:@""]; } } // Return return [NSString stringWithFormat:@"%@",result]; }
废弃
-(void)oldFunction __attribute__((deprecated("使用新API"))); @property(nonatomic,strong) NSString *oldString __attribute__((deprecated("使用新属性")));
不可用
-(void)oldFunction __attribute__((unavailable("使用新API"))); @property(nonatomic,strong) NSString *oldString __attribute__((unavailable("使用新属性")));
系统宏废弃方法
NS_AVAILABLE_IOS(5_0),告诉我们这个方法可以在iOS5.0及以后的版本中使用。如果我们在比指定版本更老的版本中调用这个方法,就会引起崩溃。
NS_AVAILABLE(5.0,2.0),这里表示这个方法随Mac OS 5.0和iOS 2.0及以后的版本中使用
NS_DEPRECATED_IOS(2_0, 6_0,"使用新API"),这个宏中有两个版本号。前面一个表明了这个方法被引入时的iOS版本,后面一个表明它被废弃时的iOS版本。被废弃并不是指这个方法就不存在了,只是意味着我们应当开始考虑将相关代码迁移到新的API上去了。
NS_DEPRECATED(10_0, 10_6, 2_0, 4_0,"使用新api"),这里表示这个方法随Mac OS 10.0和iOS 2.0被引入,在Mac OS 10.6和iOS 4.0后被废弃。
//AddressBookModel.h文件
// // AddressBookModel.h // AdderssBookSystemDemo // 本地通讯录实体类 // Created by Vie on 16/6/4. // Copyright © 2016年 Vie. All rights reserved. // #import <Foundation/Foundation.h> @interface AddressBookModel : NSObject @property (nonatomic, strong) NSString *name;//姓名(firstname,中文名只传这个) @property (nonatomic, strong) NSString *lastName;//姓氏(中文名无需理会) @property (nonatomic, strong) NSString *jobTitle;//职务 @property (nonatomic, strong) NSString *departmentName;//部门 @property (nonatomic, strong) NSString *companyName;//公司 @property (nonatomic, strong) NSMutableArray *telArray;//电话号码数组 @property (nonatomic, strong) NSMutableArray *emailArray;//邮箱 @property (nonatomic, strong) NSString *birthday;//生日(yyyy-MM-dd) @property (nonatomic, strong) NSData *imageHead;//地址薄头像数据 @property (nonatomic, strong) NSString *createDateStr;//创建记录的日期 @property (nonatomic, strong) NSString *strModificationDateStr;//记录的最后修改日期 //@property (nonatomic, strong) NSString *country;//国家 //@property (nonatomic, strong) NSString *province;//省 //@property (nonatomic, strong) NSString *city;//城市 @end
// AddressBookModel.m文件
// // AddressBookModel.m // AdderssBookSystemDemo // // Created by Vie on 16/6/4. // Copyright © 2016年 Vie. All rights reserved. // #import "AddressBookModel.h" @implementation AddressBookModel -(instancetype)init{ self=[super init]; if (self) { _telArray=[[NSMutableArray alloc] init]; _emailArray=[[NSMutableArray alloc] init]; } return self; } @end
//ManageLocalAddressBook.h文件
// // ManageLocalAddressBook.h // AdderssBookSystemDemo // 管理通讯录操作类 // Created by Vie on 2016/12/29. // Copyright © 2016年 Vie. All rights reserved. // #import <Foundation/Foundation.h> #import "AddressBookModel.h" @interface ManageLocalAddressBook : NSObject /** 单例 @return 返回ManageLocalAddressBook */ +(ManageLocalAddressBook *)shareInstance; /** 添加一个联系人到通讯录 @param addressBookModel addressBookModel 联系人实体类 @param block 添加成功或者失败 */ -(void)addContactToAddressBook:(AddressBookModel *)addressBookModel flag:(void(^)(BOOL flag))block; /** 添加多个联系人到通讯录 @param modelArray 联系人实体类数组 @param block 添加成功或者失败 */ -(void)addContactsToAddressBookByArray:(NSArray *)modelArray flag:(void(^)(BOOL flag))block; /** 加载本地通讯录 @param block 返回所有通讯录联系人信息数组 */ -(void)loadLocalAddressBook:(void(^)(NSArray *modelArray))block; /** 根据姓名模糊查询联系人 @param name 联系人姓名 @param block 匹配上的联系人 */ -(void)selectContactFromAddressBookByName:(NSString *)name array:(void(^)(NSArray *modelArray))block; /** 根据名字前缀模糊删除匹配联系人 @param name 联系人姓名 @param block 操作结果 */ -(void)removeContactFrmoAddressBookByName:(NSString *)name flag:(void(^)(BOOL flag))block; @end
// ManageLocalAddressBook.m文件
// // ManageLocalAddressBook.m // AdderssBookSystemDemo // // Created by Vie on 2016/12/29. // Copyright © 2016年 Vie. All rights reserved. // #import "ManageLocalAddressBook.h" //读取通讯录需要到头文件 #import <AddressBook/AddressBook.h> #import "AddressBookModel.h" @interface ManageLocalAddressBook () @end @implementation ManageLocalAddressBook #pragma mark Initialize +(ManageLocalAddressBook *)shareInstance{ static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ instance=[[self alloc] init]; }); return instance; } #pragma mark manageLocalAddressBook no ui /** 检测/请求通讯录访问权限 @param block 是否授权 */ -(void)checkAndRequestAddressBook:(void(^)(BOOL isAuthorized))block{ if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) { //请求通讯录权限 ABAddressBookRef addressBook= ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (error) { NSLog(@"Error: %@", (__bridge NSError *)error); block(NO); }else if (granted){ block(YES); }else{ NSLog(@"没有通讯录访问权限"); block(NO); } }); }else{ block(YES); } } /** 添加一个联系人到通讯录 @param addressBookModel addressBookModel 联系人实体类 @param block 添加成功或者失败 */ -(void)addContactToAddressBook:(AddressBookModel *)addressBookModel flag:(void(^)(BOOL flag))block{ [self checkAndRequestAddressBook:^(BOOL isAuthorized) { if (isAuthorized) { //创建对系统地址薄的引用 ABAddressBookRef addressBooks=ABAddressBookCreate(); //创建一个个人信息 ABRecordRef newPerson=ABPersonCreate(); CFErrorRef error=NULL; //添加firstname if (addressBookModel.name) { ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (__bridge CFTypeRef)addressBookModel.name, &error); } //添加lastname if (addressBookModel.lastName) { ABRecordSetValue(newPerson, kABPersonLastNameProperty, (__bridge CFTypeRef)addressBookModel.lastName, &error); } //添加职务 if (addressBookModel.jobTitle) { ABRecordSetValue(newPerson, kABPersonJobTitleProperty, (__bridge CFTypeRef)addressBookModel.jobTitle,&error); } //添加部门 if (addressBookModel.departmentName) { ABRecordSetValue(newPerson, kABPersonDepartmentProperty, (__bridge CFTypeRef)addressBookModel.departmentName,&error); } //添加公司 if (addressBookModel.companyName) { ABRecordSetValue(newPerson, kABPersonOrganizationProperty, (__bridge CFTypeRef)addressBookModel.companyName,&error); } //添加生日 if (addressBookModel.birthday) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @"yyyy-MM-dd"]; ABRecordSetValue(newPerson, kABPersonBirthdayProperty, (__bridge CFTypeRef)[dateFormatter dateFromString:addressBookModel.birthday],&error); } //添加手机号码 if (addressBookModel.telArray.count>0) { ABMutableMultiValueRef multiPhone=ABMultiValueCreateMutable(kABMultiStringPropertyType); //多个手机号码 for (NSString *telString in addressBookModel.telArray) { ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)telString, kABPersonPhoneMainLabel, NULL); } ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, &error); CFRelease(multiPhone); } //添加邮箱 if (addressBookModel.emailArray.count>0) { ABMutableMultiValueRef multiEmail=ABMultiValueCreateMutable(kABMultiStringPropertyType); for (NSString *emailString in addressBookModel.emailArray) { //多个工作邮箱 ABMultiValueAddValueAndLabel(multiEmail, (__bridge CFTypeRef)emailString, kABWorkLabel, NULL); } ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail, &error); CFRelease(multiEmail); } //添加头像 if (addressBookModel.imageHead) { ABPersonSetImageData(newPerson, (__bridge CFDataRef) addressBookModel.imageHead , &error); } //将信息添加到通讯录引用中 ABAddressBookAddRecord(addressBooks, newPerson, &error); //保存通讯录 ABAddressBookSave(addressBooks, &error); if (newPerson) {CFRelease(newPerson);} block(error?false:true); }else{ block(NO); } }]; } /** 添加多个联系人到通讯录 @param modelArray 联系人实体类数组 @return 添加成功或者失败 */ -(void)addContactsToAddressBookByArray:(NSArray *)modelArray flag:(void(^)(BOOL flag))block{ [self checkAndRequestAddressBook:^(BOOL isAuthorized) { if (isAuthorized) { //创建对系统地址薄的引用 ABAddressBookRef addressBooks=ABAddressBookCreate(); CFErrorRef error=NULL; if (modelArray.count>0) { for (AddressBookModel *addressBookModel in modelArray) { //创建一个个人信息 ABRecordRef newPerson=ABPersonCreate(); //添加firstname if (addressBookModel.name) { ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (__bridge CFTypeRef)addressBookModel.name, &error); } //添加lastname if (addressBookModel.lastName) { ABRecordSetValue(newPerson, kABPersonLastNameProperty, (__bridge CFTypeRef)addressBookModel.lastName, &error); } //添加职务 if (addressBookModel.jobTitle) { ABRecordSetValue(newPerson, kABPersonJobTitleProperty, (__bridge CFTypeRef)addressBookModel.jobTitle,&error); } //添加部门 if (addressBookModel.departmentName) { ABRecordSetValue(newPerson, kABPersonDepartmentProperty, (__bridge CFTypeRef)addressBookModel.departmentName,&error); } //添加公司 if (addressBookModel.companyName) { ABRecordSetValue(newPerson, kABPersonOrganizationProperty, (__bridge CFTypeRef)addressBookModel.companyName,&error); } //添加生日 if (addressBookModel.birthday) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @"yyyy-MM-dd"]; ABRecordSetValue(newPerson, kABPersonBirthdayProperty, (__bridge CFTypeRef)[dateFormatter dateFromString:addressBookModel.birthday],&error); } //添加手机号码 if (addressBookModel.telArray.count>0) { ABMutableMultiValueRef multiPhone=ABMultiValueCreateMutable(kABMultiStringPropertyType); //多个手机号码 for (NSString *telString in addressBookModel.telArray) { ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)telString, kABPersonPhoneMainLabel, NULL); } ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, &error); CFRelease(multiPhone); } //添加邮箱 if (addressBookModel.emailArray.count>0) { ABMutableMultiValueRef multiEmail=ABMultiValueCreateMutable(kABMultiStringPropertyType); for (NSString *emailString in addressBookModel.emailArray) { //多个工作邮箱 ABMultiValueAddValueAndLabel(multiEmail, (__bridge CFTypeRef)emailString, kABWorkLabel, NULL); } ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail, &error); CFRelease(multiEmail); } //添加头像 if (addressBookModel.imageHead) { ABPersonSetImageData(newPerson, (__bridge CFDataRef) addressBookModel.imageHead , &error); } //将信息添加到通讯录引用中 ABAddressBookAddRecord(addressBooks, newPerson, &error); if (newPerson) {CFRelease(newPerson);} } } //保存通讯录 ABAddressBookSave(addressBooks, &error); block(error?false:true); }else{ block(nil); } }]; } /** 加载本地通讯录 @param block 返回所有通讯录联系人信息数组 */ -(void)loadLocalAddressBook:(void(^)(NSArray *modelArray))block{ [self checkAndRequestAddressBook:^(BOOL isAuthorized) { if (isAuthorized) { NSMutableArray *addressBookTemp=[[NSMutableArray alloc] init]; //新建一个通讯录类 ABAddressBookRef addressBooks = ABAddressBookCreate(); //获取通讯录中的所有人 CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks); //通讯录中人数 CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks); //循环,获取每个人的个人信息 for (NSInteger i = 0; i < nPeople; i++) { //新建一个addressBook model类 AddressBookModel *addressBook = [[AddressBookModel alloc] init]; //获取个人 ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); //获取个人名字 CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty); CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty); CFStringRef abFullName = ABRecordCopyCompositeName(person); NSString *nameString = (__bridge NSString *)abName; NSString *lastNameString = (__bridge NSString *)abLastName; if ((__bridge id)abFullName != nil) { nameString = (__bridge NSString *)abFullName; } else { if ((__bridge id)abLastName != nil) { nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString]; } } addressBook.name = nameString; //获取职务 CFTypeRef abJobTitle = ABRecordCopyValue(person, kABPersonJobTitleProperty); addressBook.jobTitle=(__bridge NSString *)abJobTitle; //获取部门 CFTypeRef abDepartmentName = ABRecordCopyValue(person, kABPersonDepartmentProperty); addressBook.departmentName=(__bridge NSString *)abDepartmentName; //获取公司 CFTypeRef abCompanyName = ABRecordCopyValue(person, kABPersonOrganizationProperty); addressBook.companyName=(__bridge NSString *)abCompanyName; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @"yyyy-MM-dd"]; //获取生日 CFTypeRef peopleBirthday=ABRecordCopyValue(person, kABPersonBirthdayProperty); addressBook.birthday=[dateFormatter stringFromDate:(__bridge NSDate *)peopleBirthday]; //创建记录的日期 CFTypeRef peopleCreateDate=ABRecordCopyValue(person, kABPersonCreationDateProperty); addressBook.createDateStr=[dateFormatter stringFromDate:(__bridge NSDate *)peopleCreateDate]; //记录的最后修改日期 CFTypeRef peopleModificationDate=ABRecordCopyValue(person, kABPersonModificationDateProperty); addressBook.strModificationDateStr=[dateFormatter stringFromDate:(__bridge NSDate *)peopleModificationDate]; //获取地址薄头像数据 CFDataRef imageData=ABPersonCopyImageData(person); addressBook.imageHead=(__bridge NSData *) imageData; // addressBook.recordID = (int)ABRecordGetRecordID(person); ABPropertyID multiProperties[] = { kABPersonPhoneProperty, kABPersonEmailProperty }; NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID); for (NSInteger j = 0; j < multiPropertiesTotal; j++) { ABPropertyID property = multiProperties[j]; ABMultiValueRef valuesRef = ABRecordCopyValue(person, property); NSInteger valuesCount = 0; if (valuesRef != nil) valuesCount = ABMultiValueGetCount(valuesRef); if (valuesCount == 0) { CFRelease(valuesRef); continue; } //获取电话号码和email for (NSInteger k = 0; k < valuesCount; k++) { CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k); switch (j) { case 0: {// Phone number //使用数组处理多个手机号,并去掉 - 符号 [addressBook.telArray addObject:[(__bridge NSString*)value stringByReplacingOccurrencesOfString:@"-" withString:@""]]; break; } case 1: {// Email [addressBook.emailArray addObject:(__bridge NSString*)value]; break; } } CFRelease(value); } CFRelease(valuesRef); } //将个人信息添加到数组中,循环完成后addressBookTemp中包含所有联系人的信息 [addressBookTemp addObject:addressBook]; if (abName) {CFRelease(abName);} if (abLastName){ CFRelease(abLastName);} if (abFullName){ CFRelease(abFullName);} if (abJobTitle) {CFRelease(abJobTitle);} if (abDepartmentName) {CFRelease(abDepartmentName);} if (abCompanyName) {CFRelease(abCompanyName);} } //如果本地没有通讯录也为nil block((NSArray *)addressBookTemp) ; }else{ block(nil); } }]; } /** 根据姓名模糊查询联系人 @param name 联系人姓名 @param block 匹配上的联系人 */ -(void)selectContactFromAddressBookByName:(NSString *)name array:(void(^)(NSArray *modelArray))block{ [self loadLocalAddressBook:^(NSArray *modelArray) { NSPredicate *predicate=[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name LIKE '*%@*'",name]]; NSArray *matchingArray=[modelArray filteredArrayUsingPredicate:predicate]; block(matchingArray); }]; } /** 根据名字前缀模糊删除匹配联系人 @param name 联系人姓名 @param block 操作结果 */ -(void)removeContactFrmoAddressBookByName:(NSString *)name flag:(void(^)(BOOL flag))block{ [self checkAndRequestAddressBook:^(BOOL isAuthorized) { if (isAuthorized) { ABAddressBookRef addressBooks=ABAddressBookCreate(); CFErrorRef error=NULL; //名字前缀查询 CFArrayRef selectPeople=ABAddressBookCopyPeopleWithName(addressBooks, (__bridge CFStringRef)name); for (int i=0; i<[(__bridge NSArray *)selectPeople count]; i++) { //将信息从通讯录引用中移除 ABAddressBookRemoveRecord(addressBooks, CFArrayGetValueAtIndex(selectPeople,i), &error); } //保存通讯录 ABAddressBookSave(addressBooks, &error); if (selectPeople) {CFRelease(selectPeople);} block(error?false:true); }else{ block(nil); } }]; } @end
//实现
//NSObject+KeyValues.h文件
// // MyinfoModel.m // RuntimeTest // // Created by Vie on 2017/2/14. // Copyright © 2017年 Vie. All rights reserved. // #import <Foundation/Foundation.h> @interface NSObject (KeyValues) /** 字典转模型 @param aDictionary 字典key对应模型属性 @return 模型id */ +(id)objectWithKeyValues:(NSDictionary *)aDictionary; /** 模型转字典 @return 对应模型key的字典 */ -(NSDictionary *)keyValuesWithObject; @end
//NSObject+KeyValues.m文件
// // MyinfoModel.m // RuntimeTest // // Created by Vie on 2017/2/14. // Copyright © 2017年 Vie. All rights reserved. // #import "NSObject+KeyValues.h" #import <objc/runtime.h> #import <objc/message.h> @implementation NSObject (KeyValues) //字典转模型 +(id)objectWithKeyValues:(NSDictionary *)aDictionary{ id objc = [[self alloc] init]; for (NSString *key in aDictionary.allKeys) { id value = aDictionary[key]; //生成setter方法,并用objc_msgSend调用 NSString *methodName = [NSString stringWithFormat:@"set%@%@:",[key substringToIndex:1].uppercaseString,[key substringFromIndex:1]]; SEL setter = sel_registerName(methodName.UTF8String); //是否有该属性set方法 if ([objc respondsToSelector:setter]) { ((void (*) (id,SEL,id)) objc_msgSend) (objc,setter,value); } } return objc; } //模型转字典 -(NSDictionary *)keyValuesWithObject{ unsigned int outCount = 0; objc_property_t *propertyList = class_copyPropertyList([self class], &outCount); NSMutableDictionary *dict = [NSMutableDictionary dictionary]; for (int i = 0; i < outCount; i ++) { objc_property_t property = propertyList[i]; //生成getter方法,并用objc_msgSend调用 const char *propertyName = property_getName(property); SEL getter = sel_registerName(propertyName); if ([self respondsToSelector:getter]) { id value = ((id (*) (id,SEL)) objc_msgSend) (self,getter); /*判断当前属性是不是Model*/ if ([value isKindOfClass:[self class]] && value) { value = [value keyValuesWithObject]; } /**********************/ if (value) { NSString *key = [NSString stringWithUTF8String:propertyName]; [dict setObject:value forKey:key]; } } } free(propertyList); return dict; } @end
//模型类
//MyinfoModel.h文件
// // MyinfoModel.h // RuntimeTest // // Created by Vie on 2017/2/14. // Copyright © 2017年 Vie. All rights reserved. // #import <Foundation/Foundation.h> @interface MyinfoModel : NSObject @property(nonatomic,strong) NSString *name;//姓名 @property(nonatomic,assign) NSNumber *age;//年龄 @property(nonatomic,strong) NSArray *array;//获奖集合 @property(nonatomic,strong) NSDictionary *dic;//获奖描述 @property(nonatomic,strong) MyinfoModel *mySon;//我的仔 @end
//MyinfoModel.m文件
// // MyinfoModel.m // RuntimeTest // // Created by Vie on 2017/2/14. // Copyright © 2017年 Vie. All rights reserved. // #import "MyinfoModel.h" @implementation MyinfoModel @end
//使用
#import "MyinfoModel.h" #import "NSObject+KeyValues.h"
//字典转换为模型
NSDictionary *dictionary = @{
@"xxxx":@"xxx", @"name":@"Vie", @"age":@24, @"array":@[@"优秀少先队员",@"优秀共青团员",@"优秀党员"], @"dic":@{ @"info1":@"五年级获得优秀少先队员称号", @"info2":@"初三获得优秀共青团员称号", @"info3":@"大三获得优秀党员称号", }, @"mySon":@{ @"name":@"Vieson", @"age":@3, @"array":@[@"乖宝宝",@"精灵鬼"], @"dic":@{ @"info1":@"小宝宝很可爱", }, }, }; //下面字典转换为属性方法可以少属性,但不能多属性或者错误使用属性名(所以接口返回的字典尽量不要用改方法,如果接口以后增加返回参数,旧版本app会导致崩溃问题) MyinfoModel *model=[MyinfoModel objectWithKeyValues:dictionary];
//结果
//模型转换为字典
NSDictionary *dicByMode=[model keyValuesWithObject];
//结果
宏 | 说明 |
__func__ | 打印当前函数或方法,c字符串 |
__LINE__ | 打印当前行号,整数 |
__FILE__ | 打印当前文件路径,c字符串 |
__PRETTY_FUNCTION__ | 打印当前函数或方法(在C++中会包含参数类型),c字符串 |
//例
#define CUSTOM_LOG(info) NSLog(@"Method:%s;Line:%d;info:%@",__PRETTY_FUNCTION__, __LINE__,info); //使用 CUSTOM_LOG(@"哈哈哈🙃")
//结果
2017-05-09 21:00:52.753 RuntimeTest[3676:1340302] Method:-[ViewController viewDidLoad];Line:86;info:哈哈哈🙃
//UIHelper.h文件
// // UIHelper.h // CoreAnimationLearn // // Created by Vie on 2017/8/8. // Copyright © 2017年 Vie. All rights reserved. // #import <Foundation/Foundation.h> @interface UIHelper : NSObject /** @author Vie,2017-08-08 14:54:50 根据16进制颜色字符串返回颜色,默认透明度为1 @param colorStr 16进制颜色字符串 @return UIColor */ +(UIColor *)colorWithString:(NSString *)colorStr; /** @author Vie,2017-08-08 14:55:49 根据16进制颜色字符串返回颜色,并设置透明度 @param colorStr 16进制颜色字符串 @param alpha 透明度 @return UIColor */ +(UIColor *)colorWithString:(NSString *)colorStr alpha:(CGFloat)alpha; @end
//UIHelper.m文件
// // UIHelper.m // CoreAnimationLearn // // Created by Vie on 2017/8/8. // Copyright © 2017年 Vie. All rights reserved. // #import "UIHelper.h" @implementation UIHelper /** @author Vie,2017-08-08 14:54:50 根据16进制颜色字符串返回颜色,默认透明度为1 @param colorStr 16进制颜色字符串 @return UIColor */ +(UIColor *)colorWithString:(NSString *)colorStr{ return [self colorWithString:colorStr alpha:1.0f]; } /** @author Vie,2017-08-08 14:55:49 根据16进制颜色字符串返回颜色,并设置透明度 @param colorStr 16进制颜色字符串 @param alpha 透明度 @return UIColor */ +(UIColor *)colorWithString:(NSString *)colorStr alpha:(CGFloat)alpha{ //删除字符串中的空格 NSString *cString=[[colorStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString]; //字符串长度应该是6到8位,包括(#开头,0X开头,直接16进制值) if ([cString length]<6) { return nil; } //如果是0X开头 if ([cString hasPrefix:@"0X"]) { cString=[cString substringFromIndex:2]; } //如果是#开头 if ([cString hasPrefix:@"#"]) { cString=[cString substringFromIndex:1]; } if ([cString length]!=6) { return nil; } //颜色赋值 unsigned int r, g, b; NSRange range; range.length=2; range.location=0; [[NSScanner scannerWithString:[cString substringWithRange:range]] scanHexInt:&r]; range.location=2; [[NSScanner scannerWithString:[cString substringWithRange:range]] scanHexInt:&g]; range.location=4; [[NSScanner scannerWithString:[cString substringWithRange:range]] scanHexInt:&b]; return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:alpha]; } @end
//让约束或者布局从导航栏底部开始算起(导航栏底部为Y轴0) self.edgesForExtendedLayout = UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars = NO; self.modalPresentationCapturesStatusBarAppearance = NO;
#import <CoreTelephony/CTTelephonyNetworkInfo.h> #import <CoreTelephony/CTCarrier.h> NSMutableDictionary *dic = [[NSMutableDictionary alloc]init]; CTTelephonyNetworkInfo *current = [[CTTelephonyNetworkInfo alloc] init]; [dic setObject:current.subscriberCellularProvider.carrierName forKey:@"carrierName"]; [dic setObject:current.subscriberCellularProvider.mobileCountryCode forKey:@"mobileCountryCode"]; [dic setObject:current.subscriberCellularProvider.mobileNetworkCode forKey:@"mobileNetworkCode"]; [dic setObject:current.subscriberCellularProvider.isoCountryCode forKey:@"isoCountryCode"]; [dic setObject:[NSNumber numberWithBool:current.subscriberCellularProvider.allowsVOIP] forKey:@"allowsVOIP"];
运行结果
//VStringHelper.h文件
// // VStringHelper.h // 字符串帮助类 // // Created by Vie on 2017/11/14. // Copyright © 2017年 Vie. All rights reserved. // #import <Foundation/Foundation.h> @interface VStringHelper : NSObject /** @author Vie,2017年11月14日17:11:10 判断字符串是否为空,空YES,非空NO @param string 需要判断的字符串 @return BOOL */ +(BOOL)isEmpty:(NSString *)string; /** @author Vie,2017年11月14日17:11:10 判断字符串是否为非空,空NO,非空YES @param string 需要判断的字符串 @return BOOL */ +(BOOL)isNotEmpty:(NSString *)string; /** @author Vie,2017-12-12 10:16:17 判断字符串是否为全中文 @param string 需要判断的字符串 @return BOOL */ +(BOOL) isAllChinese:(NSString *)string; /** @author Vie,2017-12-12 10:18:49 判断字符串是否为全数字 @param string 需要判断的字符串 @return BOOL */ +(BOOL)isAllNumber:(NSString *)string; /** @author Vie,2017-12-12 10:19:54 判断字符串是否为全字母 @param string 需要判断的字符串 @return BOOL */ +(BOOL)isAllAlpha:(NSString *)string; /** @author Vie,2017-12-12 10:19:58 判断字符串是否仅输入字母或数字 @param string 需要判断的字符串 @return BOOL */ +(BOOL) isOnlyAlphaNum:(NSString *)string; @end
//VStringHelper.m文件
// // VStringHelper.m // 字符串帮助类 // // Created by Vie on 2017/11/14. // Copyright © 2017年 Vie. All rights reserved. // #import "VStringHelper.h" @implementation VStringHelper /** @author Vie,2017年11月14日17:11:10 判断字符串是否为空,空true,非空false @param string 需要判断的字符串 @return BOOL */ +(BOOL)isEmpty:(NSString *)string{ if (string == nil || string == NULL) { return YES; } if ([string isKindOfClass:[NSNull class]]) { return YES; } if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0) { return YES; } return NO; } /** @author Vie,2017年11月14日17:11:10 判断字符串是否为非空,空false,非空true @param string 需要判断的字符串 @return BOOL */ +(BOOL)isNotEmpty:(NSString *)string{ if (string == nil || string == NULL) { return NO; } if ([string isKindOfClass:[NSNull class]]) { return NO; } if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0) { return NO; } return YES; } /** @author Vie,2017-12-12 10:16:17 判断字符串是否为全中文 @param string 需要判断的字符串 @return BOOL */ +(BOOL) isAllChinese:(NSString *)string { NSString *regex = @"[\u4e00-\u9fa5]+"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; if (![pred evaluateWithObject:string]) { return NO; } return YES; } /** @author Vie,2017-12-12 10:18:49 判断字符串是否为全数字 @param string 需要判断的字符串 @return BOOL */ +(BOOL)isAllNumber:(NSString *)string { NSString *regex =@"[0-9]*"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; if (![pred evaluateWithObject:string]) { return NO; } return YES; } /** @author Vie,2017-12-12 10:19:54 判断字符串是否为全字母 @param string 需要判断的字符串 @return BOOL */ +(BOOL)isAllAlpha:(NSString *)string { NSString *regex =@"[a-zA-Z]*"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; if (![pred evaluateWithObject:string]) { return NO; } return YES; } /** @author Vie,2017-12-12 10:19:58 判断字符串是否仅输入字母或数字 @param string 需要判断的字符串 @return BOOL */ +(BOOL) isOnlyAlphaNum:(NSString *)string { NSString *regex =@"[a-zA-Z0-9]*"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; if (![pred evaluateWithObject:string]) { return NO; } return YES; } @end
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSLog(@"%@",infoDictionary); NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"]; NSLog(@"当前应用名称:%@",appCurName); // 当前应用软件版本 比如:1.0.1 NSString *appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; NSLog(@"当前应用软件版本:%@",appVersion); // 当前应用版本号码 int类型 NSString *appVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"]; NSLog(@"当前应用版本号码:%@",appVersionNum); //手机序列号 NSUUID *identifierNumber = [[UIDevice currentDevice] identifierForVendor]; NSLog(@"手机序列号: %@",identifierNumber); //手机别名: 用户定义的名称 NSString* userPhoneName = [[UIDevice currentDevice] name]; NSLog(@"手机别名: %@", userPhoneName); //设备名称 NSString* deviceName = [[UIDevice currentDevice] systemName]; NSLog(@"设备名称: %@",deviceName ); //手机系统版本 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; NSLog(@"手机系统版本: %@", phoneVersion); //手机型号 NSString* phoneModel = [[UIDevice currentDevice] model]; NSLog(@"手机型号: %@",phoneModel ); //地方型号 (国际化区域名称) NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel]; NSLog(@"国际化区域名称: %@",localPhoneModel );
NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。
//=、==:判断两个表达式是否相等,在谓词中=和==是相同的意思都是判断,而没有赋值这一说 NSNumber *testNumber = @123; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = 123"]; if ([predicate evaluateWithObject:testNumber]) { NSLog(@"testString:%@", testNumber); }
//BETWEEN:BETWEEN表达式必须满足表达式 BETWEEN {下限,上限}的格式,要求该表达式必须大于或等于下限,并小于或等于上限 NSNumber *testNumber = @123; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {100, 200}"]; if ([predicate evaluateWithObject:testNumber]) { NSLog(@"testString:%@", testNumber); } else { NSLog(@"不符合条件"); }
//AND、&&:逻辑与,要求两个表达式的值都为YES时,结果才为YES。 NSArray *testArray = @[@1, @2, @3, @4, @5, @6]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"]; NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate]; NSLog(@"filterArray:%@", filterArray);