网上收集的以及自己总结的iOS开发技巧
Objective-C
1.让Xcode的控制台支持LLDB类型的打印
这有什么用?
怎么说尼,笔者认为这个还是比较有用滴,为什么有用尼?
因为在Xcode断点调试的时候, 在控制台输入 po self.view.frame 或者 po id 类型的时候就死翘翘了。
不信? 看如下图 :
进入正题
打开终端输入三条命令:
1. touch ~/.lldbinit
2. echo display @import UIKit >> ~/.lldbinit
3. echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit
输完命令后没有任何提示? 好吧, 那恭喜你成功了~! 然后, 最关键的一步来了, 那就是…
重新运行项目(不用重启Xcode也可以),看如下图~~
就代表成功啦
那么现在我们继续在控制台输入po self.view.frame
成功了!如果po指令是一个id类型也可以正常打印。是不是感觉方便很多呀? 反正我是这么觉得。至于有没有用就看个人需要咯~~!
如何删除?
好吧, 那么问题来了, 我用命令创建, 如果不想玩了怎么办尼??
其实很简答, 看第一条命令touch ~/.lldbinit,就是在根目录下创建了一个隐藏文件.lldbinit,然后删除这个文件就搞定啦。
打开终端然后,在终端输入 :?rm ~/.lldbinit 命令即可.
2.用宏定义检测block是否可用!
- #define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); };
- // 宏定义之前的用法
- /*
- if (completionBlock)
- {
- completionBlock(arg1, arg2);
- }
- */
- // 宏定义之后的用法
- BLOCK_EXEC(completionBlock, arg1, arg2);
3.用@() 来包含C字符串 或者非OC对象
- NSString *propertyAttributesString =
- @(property_getAttributes(class_getProperty([NSObject class], "description")));
4.使用ARC和不使用ARC(from 夏夏)
- //使用ARC和不使用ARC
- #if __has_feature(objc_arc)
- //compiling with ARC
- #else
- // compiling without ARC
- #endif
5.iOS图片内存优化(博文)内存优化经验(from 灰灰)
解决步骤:instrument调试后,发现没被释放的全是imageIO,差不多就知道了,把读图的方式,从[UIImage imageNamed:@”“],改成imageWithContentsOfFile,就可以了。
问题原因:imageNamed读取图片的方法,会缓存在内存中,所以较大的图片,还是用imageWithContentsOfFile。
Tip1:.xcassets里的图片无法用imageWithContentsOfFile读取;
Tip2:imageWithContentsOfFile读取图片需要加文件后缀名如png,jpg等;
6.在控制台里打印controller的层级
在控制台里使用po [UIViewController _printHierarchy]命令即可打印出controller的层级,一目了然.大家都去玩玩吧~~1
7.在控制台里打印view的层级
在控制台里使用po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令即可打印出view的层级,一目了然。
当然,可能对于某一些人来说打印window下的所有view层级,会觉得眼花缭乱。
但是,也可以打印指定某一个view的层级。
- po [view recursiveDescription]
8.在debug模式下的控制台里使用po命令打印对象的属性和值
添加分类,加上代码即可。不用导入头文件,即可在控制台里使用po命令打印出model的属性和值,这个方法主要使用方法欺骗的手段,替换系统的description方法
9.用宏创建单例
- #define SYNTHESIZE_SINGLETON_FOR_CLASS_ARC(className) \
- \
- + (className *)shared##className { \
- static className *shared##className = nil; \
- static dispatch_once_t onceToken; \
- dispatch_once(&onceToken, ^{ \
- shared##className = [[self alloc] init]; \
- }); \
- return shared##className; \
- }
10.判断系统是否大于、小于、等于某个版本
- #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
- #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
- #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
11.弱引用与强引用宏
- #define STRONGSELF() __strong typeof(weakSelf)strongSelf = weakSelf
- #define WEAKSELF() __weak __typeof(&*self)weakSelf = self
在自定义的block里面,弱引用之后还要再强引用一下,防止被释放
- WEAKSELF();
- _loanStylePicker.selcetBlock = ^(NSUInteger index ,NSUInteger seledRow)
- {
- STRONGSELF();
- [strongSelf.tableView reloadData];
- };
但是有一点需要注意的是,系统的block是不需要弱引用的,原因请参考https://www.zhihu.com/question/36358590
12.隐藏导航栏下面的那条分隔线的方法
- [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forBarMetrics:UIBarMetricsDefault];
- self.navigationController.navigationBar.shadowImage = [UIImage new];
- + (UIImage *) imageWithColor: (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;
- }
13.监听网络状态
- [[AFNetworkReachabilityManager sharedManager] startMonitoring];
- // 检测网络连接的单例,网络变化时的回调方法
- [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
- DDLogInfo(@"%ld", (long)status);
- NSString *netName;
- switch (status) {
- case AFNetworkReachabilityStatusUnknown:
- netName = @"未知";
- break;
- case AFNetworkReachabilityStatusNotReachable:
- netName = @"无网络";
- break;
- case AFNetworkReachabilityStatusReachableViaWWAN:
- netName = @"3G";
- break;
- case AFNetworkReachabilityStatusReachableViaWiFi:
- netName = @"wifi";
- break;
- default:
- break;
- }
- }];
14.如何在xib中快速设置borderWidth、borderColor、cornerRadius、maskToBounds
.h文件
- #import <UIKit/UIKit.h>
- @interface UIView (layerAdditions)
- @property (nonatomic, assign) IBInspectable CGFloat bx_borderWidth;
- @property (nonatomic, strong) IBInspectable UIColor *bx_borderColor;
- @property (nonatomic, assign) IBInspectable CGFloat bx_cornerRadius;
- @property (nonatomic, assign) IBInspectable BOOL bx_maskToBounds;
- @end
.m文件
- #import <objc/runtime.h>
- @implementation UIView (layerAdditions)
- - (void)setBx_borderColor:(UIColor *)bx_borderColor
- {
- objc_setAssociatedObject(self, @selector(bx_borderColor), bx_borderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- self.layer.borderColor = bx_borderColor.CGColor;
- }
- - (UIColor *)bx_borderColor
- {
- return objc_getAssociatedObject(self, _cmd);
- }
- - (void)setBx_borderWidth:(CGFloat)bx_borderWidth
- {
- objc_setAssociatedObject(self, @selector(bx_borderWidth), @(bx_borderWidth), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- self.layer.borderWidth = bx_borderWidth;
- }
- - (CGFloat)bx_borderWidth
- {
- return [objc_getAssociatedObject(self, _cmd) floatValue];
- }
- - (void)setBx_cornerRadius:(CGFloat)bx_cornerRadius
- {
- objc_setAssociatedObject(self, @selector(bx_cornerRadius), @(bx_cornerRadius), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- self.layer.cornerRadius = bx_cornerRadius;
- }
- - (CGFloat)bx_cornerRadius
- {
- return [objc_getAssociatedObject(self, _cmd) floatValue];
- }
- - (void)setBx_maskToBounds:(BOOL)bx_maskToBounds
- {
- objc_setAssociatedObject(self, @selector(bx_maskToBounds), @(bx_maskToBounds), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- self.layer.masksToBounds = bx_maskToBounds;
- }
- - (BOOL)bx_maskToBounds
- {
- return [objc_getAssociatedObject(self, _cmd) boolValue];
- }
- @end
网上收集的以及自己总结的iOS开发技巧的更多相关文章
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...
- 【转】几点 iOS 开发技巧
[译] 几点 iOS 开发技巧 原文:iOS Programming Architecture and Design Guidelines 原文来自破船的分享 原文作者是开发界中知晓度相当高的 Mug ...
- iOS开发技巧 -- 复用代码片段
如果你是一位开发人员在开发过程中会发现有些代码无论是在同一个工程中还是在不同工程中使用率会很高,有经验的人会直接封装在一个类里,或者写成一个宏定义或者把这些代码收集起来,下次直接使用,或者放到xcod ...
- iOS开发技巧
一.寻找最近公共View 我们将一个路径中的所有点先放进 NSSet 中.因为 NSSet 的内部实现是一个 hash 表,所以查找元素的时间复杂度变成了 O(1),我们一共有 N 个节点,所以总时间 ...
- iOS开发技巧系列---使用链式编程和Block来实现UIAlertView
UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...
- iOS开发技巧 - Size Class与iOS 8多屏幕适配(一)
0. 背景: 在iOS开发中,Auto Layout(自动布局)能解决大部分的屏幕适配问题. 但是当iPhone 6和iPhone 6 Plus发布以后, Auto Layout已经不能解决复杂的屏幕 ...
- 几点iOS开发技巧
转自I'm Allen的博客 原文:iOS Programming Architecture and Design Guidelines 原文来自破船的分享 原文作者是开发界中知晓度相当高 ...
- iOS开发技巧-2
1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图 ...
- IOS开发技巧快速生成二维码
随着移动互联网的发展,二维码应用非常普遍,各大商场,饭店,水果店 基本都有二维码的身影,那么ios中怎么生成二维码呢? 下面的的程序演示了快速生成二维码的方法: 在ios里面要生成二维码,需要借助一个 ...
随机推荐
- Mac 快捷键整理
Mac 快捷键整理 文本编辑 适用于文本编辑器,浏览器等 跳到页首 cmd + ↑ 类似windows下的 ctrl + home 跳到页尾 cmd + ↓ 类似windows下的 ctrl + en ...
- hasOwnProperty()&&isPrototypeOf()
1.hasOwnProperty() hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性.如果有,返回true,否则返回false. 该方法属于Object ...
- atitit.web原理 理论attilax总结
atitit.web原理 理论attilax总结 1. Web3.01 2. Web的未来趋势1 3. Web语言与应用导论_百度百科.html2 4. <Web设计与编程导论(影印版)> ...
- paip.语义分析--单字动词表.txt
paip.语义分析--单字动词表.txt 排除重复 select * from t where word in (SELECT word from t_a) or word in (SELEC ...
- 固定表头/锁定前几列的代码参考[JS篇]
引语:做有难度的事情,才是成长最快的时候.前段时间,接了一个公司的稍微大点的项目,急着赶进度,本人又没有独立带过队,因此,把自己给搞懵逼了.总是没有多余的时间来做自己想做的事,而且,经常把工作带入生活 ...
- JSTL自定义标签
这节我们总结一下JSTL自定义标签相关内容. 1. 自定义标签简介 自定义标签主要用于移除JSP页面中的Java代码.Jsp页面主要是用来显示给前台的,如果里面有过多的java代码的话,会显得很乱,但 ...
- css解决谷歌,360浏览器默认最小字体为12px问题
当我们设置前台html页面样式问题字体小于12px;时,会发现不管怎么设置小于12px字体,在谷歌.360浏览器上都不生效. 但在火狐等浏览器上却可以正常设置,当你打开谷歌360的设置后会发现,它们设 ...
- VS2015 ASP.NET5 Web项目结构浅析
前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本 ...
- Python:如何显示进度条
首先,推荐一个组件:progressive 效果如下: 进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过std ...
- Linear or non-linear shadow maps?
Quote: Original post by RobMaddisonI understand that, for aliasing mitigation, it might be beneficia ...