代码改变世界

iOS,非视图类方法

2016-11-14 14:26  帅不过三秒  阅读(371)  评论(0编辑  收藏  举报

1.判断类的实例

2.获取当前最高层Window

3.获取当前app是否活跃

4.允许所有请求

5.判断设备是否越狱

6.移除字符串换行符和空格

7.iOS注释方法或属性废弃或不可用

8.本地通讯录操作

9.字典与模型类转

10.宏定义日志打印

11.16进制颜色转换

12.让约束或者布局从导航栏底部开始算起

13.获取手机运营商信息

14.判断各种条件字符串

15.获取app名称和版本等信息

16.NSPredicate谓词的使用

判断类的实例

isKindOfClass        //判断是否是这个类或者这个类的子类的实例

例:

 

[mystring isKindOfClass:[NSString class]]

 

isMemberOfClass  //判断是否是这个类的实例

例:

 

[mystring isMemberOfClass:[NSString class]]

 

 

获取当前最上层Window

 //防止提示被键盘遮挡,直接展示到最高

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是否活跃

 //当前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];
}

 

 

iOS注释方法或属性废弃或不可用

废弃

-(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:哈哈哈🙃

 

16进制颜色转换

//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

 

  

获取app名称和版本等信息

 

    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谓词的使用

  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);