iOS开发中常用的方法(二)(持续更新)

接上一篇 iOS开发中常用的方法(一)#

NSString常见用法:####

全部字符转为大写字母
-(NSString*)uppercaseString 

全部字符转为小写字母
-(NSString*)lowercaseString

把每个单词首字母大写,其他字母小写:
-(NSString*)capitalizedString

比较两个对象的内容是否相同:
-(BOOL)isEqualToString:(NSString*)aString

比较两个字符串内容(ASCII码)的大小:
-(NSComparisonResult)compare:(NSString*)string;
比较两个字符串的地址是否相同用"=="

忽略大小写进行比较:
-(NSComparisonResult)caseInsensitiveCompare:(NSString*)string;

有条件比较:
- (NSComparisonResult)compare:(NSString *)string options (NSStringCompareOptions)mask;  
options常用的三个条件:    
NSCaseInsensitiveSearch:忽略大小写    
NSLiteralSearch:默认的,全比较    
NSNumericSearch:字母还是比较ascii码,如果遇到数字,比较数字的大小(还是一位一位的比较) 
NSComparisonResult:枚举   
三个值:NSOrderedAscending(升序), NSOrderedSame, NSOrderedDescending(降序)   

判断是否sString开头:
-(BOOL)hasPrefix:(NSString*)sString;

判断是否sString结尾
-(BOOL)hasSuffix:(NSString*)sString;

检查字符串中是否包含sString:
-(NSRang)rangOfString:(NSString*)aString;

反方向搜索:
[str rangeOfString:@"str"options:NSBackwardsSearch];

从指定位置from开始截取到尾部:
-(NSString*)substringFormIndex:(NSUInteger)from;

从字符串的开头一直截取到指定位置to,但不包括该位置的字符:
-(NSString*)substringToIndex:(NSUInteger)to;

按照所给出的NSRange从字符串中截取字符串:
-(NSString*)substringWithRange:(NSRange)range;

用replacement替换target:
-(NSString*)stringByReplacingOccurrencesOfString:(NSSting*)target withString:(NSString*)replacement;

返回字符串长度:
-(NSUInteger)length;

返回index位置对应的字符:
-(unichar)characterAtIndex:(NSUInteger)index;

各种去掉: 
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set; 

去掉头尾空格
+ (id)whitespaceCharacterSet; 

去除所有的空格: 
[str stringByRep]acingOccurrencesOfString:@" "withString:@“”]

去掉头尾所有的小写字母 
+ (id)lowercaseLetterCharacterSet; 

去掉头尾所有的大写字母
+ (id)uppercaseLetterCharacterSet; 

去掉头尾的指定字符串
+ (id)characterSetWithCharactersInString:(NSString *)aString; 

常见文件操作###

这个文件或文件夹(目录)是否存在
- (BOOL)fileExistsAtPath:(NSString *)path;

 这个文件或文件夹是否存在, isDirectory代表是否为文件夹
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;

这个文件或文件夹是否可读
- (BOOL)isReadableFileAtPath:(NSString *)path;

这个文件或文件夹是否可写
- (BOOL)isWritableFileAtPath:(NSString *)path;

这个文件或文件夹是否可删除
- (BOOL)isDeletableFileAtPath:(NSString *)path;

获得这个文件\文件夹的属性
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;

 查找给定路径下的所有子路径,返回一个数组,深度查找,不限于当前层,也会查找package的内容。
- (NSArray *)subpathsAtPath:(NSString *)path;

 获的的当前子路径下的所有直接子内容必须是一个目录
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

创建文件
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attire;
 参数1:路径
 参数2:文件内容
 参数3:属性
  
创建文件夹(createIntermediates为YES代表自动创建中间的文件夹)
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL) createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;

拷贝,如果目标目录已经存在同名文件,则无法拷贝
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

移动(剪切)移动文件
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

删除文件
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;

@@@当前版本@@@1.1.1-0
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];

异常捕捉:

(try catch并不能检测所有的错误)
例: b = NO;
@try  
//只能写一个
{ 
 int rezult = a/b;
//这里放的是有可能出错的代码
}  
@catch(NES xception *exception)   
//可以写多个
   {
     //此处放出错以后我们处理的代码
   }
@finally   
//只能写一个
{  
 printf("abcd\n");
//不管是否出错这行代码一定会执行
}

获取类的所有属性

+ (NSDictionary *)getPropertys
{
    NSMutableArray *proNames = [NSMutableArray array];
    NSMutableArray *proTypes = [NSMutableArray array];
    NSArray *theTransients = [[self class] transients];
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        //获取属性名
        NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        if ([theTransients containsObject:propertyName]) {
            continue;
        }
        [proNames addObject:propertyName];
        //获取属性类型等参数
        NSString *propertyType = [NSString stringWithCString: property_getAttributes(property) encoding:NSUTF8StringEncoding];
       
        if ([propertyType hasPrefix:@"T@"]) {
            [proTypes addObject:SQLTEXT];
        } else if ([propertyType hasPrefix:@"Ti"]||[propertyType hasPrefix:@"TI"]||[propertyType hasPrefix:@"Ts"]||[propertyType hasPrefix:@"TS"]||[propertyType hasPrefix:@"TB"]||[propertyType hasPrefix:@"Tq"]||[propertyType hasPrefix:@"TQ"]) {
            [proTypes addObject:SQLINTEGER];
        } else {
            [proTypes addObject:SQLREAL];
        }
        
    }
    free(properties);
    
    return [NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil];
}

获取沙盒路径

获取libraryCache路径

-(instancetype)appendCache
{
    return [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:self.lastPathComponent];
}

获取Documents路径

-(instancetype)appendDocuments
{
    return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:self.lastPathComponent];
}

获取Temp路径

-(instancetype)appendTemp
{
    return [NSTemporaryDirectory() stringByAppendingPathComponent:self.lastPathComponent];
}

XML解析

  • 开始文档,只需要做一次,一般在这里初始化一个数组
- (void)parserDidStartDocument:(NSXMLParser *)parser{ 
}
  • 开始节点,会调用多次
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{}
  • 找到内容,会调用多次
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
}
  • 结束节点,会调用多次
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{}
  • 结束节点,只会调用一次,拿到最终的结果
- (void)parserDidEndDocument:(NSXMLParser *)parser{}

XML解析第三方框架: GDataXMLElement

判断请求地址是否可用

  +(BOOL) pingUrl: (NSString *) urlStr {

  NSURL* URL = [NSURL URLWithString:urlStr];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
  [request setHTTPMethod:@"HEAD"];
  NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

  __block BOOL result;
  NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

      if (error) {

          result = NO;

      }else{

          result = YES;
      }

  }];

  [task resume];


  return result;
}

全局常量及宏定义

设置RGB颜色

#define RGB(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

弹框

#define HUD(text)  if (((NSString *)text).length > 0) {MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];hud.mode = MBProgressHUDModeText;hud.labelText = text;[hud setRemoveFromSuperViewOnHide:YES];[hud hide:YES afterDelay:1];}

导航栏标题

#define SET_NAV_TITLE(_TITLE) ({UILabel *titleLabel = [[UILabel alloc] init];titleLabel.backgroundColor = [UIColor clearColor];titleLabel.textColor = [UIColor whiteColor];titleLabel.text = _TITLE;titleLabel.font=[UIFont boldSystemFontOfSize:18];[titleLabel sizeToFit];self.navigationItem.titleView = titleLabel;})

导航栏返回按钮

#define SET_BACK_ITEM(_IMAGENAME) ({UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeCustom];[leftButton setFrame:CGRectMake(0, 0, 25, 25)];[leftButton setImage:[UIImage imageNamed:_IMAGENAME] forState:UIControlStateNormal];[leftButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchDown]; leftButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:leftButton];})

导航栏左右item

#define SET_NAV_ITEM(_TITLE,ISLEFT) ({UIButton *navButton = [UIButton buttonWithType:UIButtonTypeCustom];[navButton setFrame:CGRectMake(0, 0, 56, 56)];[navButton setTitle:_TITLE forState:UIControlStateNormal];[navButton addTarget:self action:@selector(navButtonClick:) forControlEvents:UIControlEventTouchDown];navButton.titleLabel.font = [UIFont systemFontOfSize:14];if(ISLEFT){navButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:navButton];} else {navButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:navButton];} })

判断是否是iOS8以上

#define iOS8Later ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

重定义NSLog

#define Log(format, ...) NSLog(@"%s--line:%d " format, __FUNCTION__, __LINE__, ##__VA_ARGS__)

UserDefaults

#define kUserDefaults [NSUserDefaults standardUserDefaults]
```
切换跟控制器的通知
```
#define kSwitchRootViewControllerNotification @"SwitchRootViewControllerNotification"
```
 Navigaiton高度
```
#define  NavBarHeight 64
```
屏幕高度
```
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
```
得到屏幕宽度
```
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
```
屏幕适配
```
#define kWidthValue(value) ((value)/375.0f*[UIScreen mainScreen].bounds.size.width)

#define kHeightValue(value) ((value)/667.0f*[UIScreen mainScreen].bounds.size.height)
```
判断是真机还是模拟器
```
#if TARGET_OS_IPHONE
//iPhone Device
#endif
 
#if TARGET_IPHONE_SIMULATOR
//iPhone Simulator
#endif
```

打印日志
```
#ifdef DEBUG
#define LRLog(...) NSLog(@"%s 第%d行 \n %@\n\n",__func__,__LINE__,[NSString stringWithFormat:__VA_ARGS__])
#else
#define LRLog(...)

#endif
```
强弱引用
```
#define kWeakSelf(type)  __weak typeof(type) weak##type = type;
#define kStrongSelf(type)  __strong typeof(type) type = weak##type;
```

设置控件圆角边框
```
#define kBorderRadius(Obj, Radius, Width, Color)\
[Obj.layer setCornerRadius:(Radius)];\
[Obj.layer setMasksToBounds:YES];\
[Obj.layer setBorderWidth:(Width)];\
[Obj.layer setBorderColor:[Color CGColor]]
```

GCD
```
//GCD - 一次性执行
#define kDISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);

//GCD - 在Main线程上运行
#define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);

//GCD - 开启异步线程
#define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), globalQueueBlocl);
```

获取沙盒目录
```
//获取temp
#define kPathTemp NSTemporaryDirectory()
//获取沙盒 Document
#define kPathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
//获取沙盒 Cache
#define kPathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
```

###获取成员变量
```
//定义一个保存成员变量个数的变量                            
unsignedint count = 0;                            
Ivar* ivars =  class_copyIvarList([obj class], &count);
//遍历成员列表找到需要的属性                                                       
for (int i = 0; i < count; i++)                            
{                                                               
//获取成员                               
 Ivar ivar = ivars[i];                                                               
//获取属性名                               
 constchar* name = ivar_getName(ivar);                               
//属性的类型                              
constchar * type = ivar_getTypeEncoding(ivar);                                                               
//转化成字符串                                
NSString* nameStr = [NSStringstringWithUTF8String:name];                                
NSString* typeStr = [NSStringstringWithUTF8String:type];                                NSLog(@"name:%@,type:%@",nameStr,typeStr);                                    
//给成员变量赋值                               
 if ([nameStr isEqualToString:@"_internalView"])                        
  {
   [obj setValue:imageView forKey:@"_internalView"];                                                               
  }
                          
}
```
###修改textField的placeholder的字体颜色、大小
```
self.textField.placeholder = @"请输入用户名";
[self.textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];
```
###计算两点距离
```
static __inline__ CGFloat CGPointDistanceBetweenTwoPoints(CGPoint point1, CGPoint point2) { CGFloat dx = point2.x - point1.x; CGFloat dy = point2.y - point1.y; return sqrt(dx*dx + dy*dy);}
```
###收起键盘的相关方法
```
1、点击键盘的Return收起键盘
- (BOOL)textFieldShouldReturn:(UITextField *)textField { return [textField resignFirstResponder]; }

2、点击View收起键盘
[self.view endEditing:YES];

3、统一收起键盘
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
```
###获取当前硬盘空间
```
NSFileManager *fm = [NSFileManager defaultManager];
    NSDictionary *fattributes = [fm attributesOfFileSystemForPath:NSHomeDirectory() error:nil];

    NSLog(@"容量%lldG",[[fattributes objectForKey:NSFileSystemSize] longLongValue]/1000000000);
    NSLog(@"可用%lldG",[[fattributes objectForKey:NSFileSystemFreeSize] longLongValue]/1000000000);
```
###将UIColor转为UIImage
```
- (UIImage *)createImageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return theImage;
}
```
###SDWebImage清理缓存
```
// 清理内存
[[SDImageCache sharedImageCache] clearMemory];

// 清理webview 缓存
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
    [storage deleteCookie:cookie];
}

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
[config.URLCache removeAllCachedResponses];
[[NSURLCache sharedURLCache] removeAllCachedResponses];

// 清理硬盘
[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];

    [self.tableView reloadData];
}];
```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,418评论 25 707
  • 前几天刷朋友圈被一个朋友发的图片锁住了双眸。她人在美国,利用暑假跑去阿拉斯加来了一场世纪大穿越。 前面的几...
    爱君如梦1987阅读 410评论 0 0
  • 不会破案的男神不是真正的地坪专家。 听男神讲地坪,从工艺到材料,从经营方式到人际关系,那气势简直就是...
    cf302fb8f796阅读 396评论 0 1
  • 每个人都会有一段低迷的时期,你我都一样 最近怎么样,朋友们? 一切都还好吧? 那些许久没见的,你们还在奋斗么? 我...
    时刻搬砖阅读 439评论 0 0
  • 文/文郎画竹 提问1:中途无力缴费了,有何办法? 回答: 保险都是长期缴费的,有些10年,20年,30年甚至更久。...
    文郎画竹阅读 773评论 2 8