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开发技巧的更多相关文章

  1. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

  2. 【转】几点 iOS 开发技巧

    [译] 几点 iOS 开发技巧 原文:iOS Programming Architecture and Design Guidelines 原文来自破船的分享 原文作者是开发界中知晓度相当高的 Mug ...

  3. iOS开发技巧 -- 复用代码片段

    如果你是一位开发人员在开发过程中会发现有些代码无论是在同一个工程中还是在不同工程中使用率会很高,有经验的人会直接封装在一个类里,或者写成一个宏定义或者把这些代码收集起来,下次直接使用,或者放到xcod ...

  4. iOS开发技巧

    一.寻找最近公共View 我们将一个路径中的所有点先放进 NSSet 中.因为 NSSet 的内部实现是一个 hash 表,所以查找元素的时间复杂度变成了 O(1),我们一共有 N 个节点,所以总时间 ...

  5. iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

    UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...

  6. iOS开发技巧 - Size Class与iOS 8多屏幕适配(一)

    0. 背景: 在iOS开发中,Auto Layout(自动布局)能解决大部分的屏幕适配问题. 但是当iPhone 6和iPhone 6 Plus发布以后, Auto Layout已经不能解决复杂的屏幕 ...

  7. 几点iOS开发技巧

    转自I'm Allen的博客   原文:iOS Programming Architecture and Design Guidelines   原文来自破船的分享   原文作者是开发界中知晓度相当高 ...

  8. iOS开发技巧-2

    1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图 ...

  9. IOS开发技巧快速生成二维码

    随着移动互联网的发展,二维码应用非常普遍,各大商场,饭店,水果店 基本都有二维码的身影,那么ios中怎么生成二维码呢? 下面的的程序演示了快速生成二维码的方法: 在ios里面要生成二维码,需要借助一个 ...

随机推荐

  1. [转]一个文件上传的jquery插件

    http://www.jb51.net/article/51547.htm 这篇文章主要介绍了使用ajaxfileupload.js实现ajax上传文件php版,需要的朋友可以参考下     无论是P ...

  2. Server Develop (七) Linux 守护进程

    守护进程 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装 ...

  3. [安卓] 4、CheckBox、RadioButton和Toast简单用法

      和按钮类似,这里采用cb1.setOnCheckedChangeListener(this);方法分别对3个CheckBox进行CheckChange事件绑定,然后在onCheckedChange ...

  4. p4 是否能自动merge

      总结: 1)如果在copy merge(-at)/auto merge(-am)后修改source branch,则可以自动被copy merge: 2)如果在manual merge后修改sou ...

  5. DigitalOcean上使用Tornado+MongoDB+Nginx+Supervisor+DnsPod快速搭建个人博客

    DigitalOcean 之前买了个便宜的VPS并且在上面搭建了我自己写的博客程序,后来VPS里运行MongoDB经常自己挂掉就索性没理了.直到现在VPS已经过期,服务器被强制关掉了.周末在家索性想着 ...

  6. paip.中文 分词 -- 同义词大全整理

    paip.中文 分词 -- 同义词大全整理 同义词的处理方法: 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blo ...

  7. Java集合——题目

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  8. 共享jQuery/Eclipse/SVN/PS/DW/的API文档

    1:jQuery的API和jquery.js和jquery.min.js 链接:http://pan.baidu.com/s/1gf7GD83 密码:tbt1 2:虚拟机软件和frdora和ubunt ...

  9. Win7下SQLite的简单使用

    前言 SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎.SQLite 源代码不受版权限制. 简 ...

  10. PHP之負載均衡下的session共用

    最近忙於開發台灣運動彩券第四版的程式,所以已經很久沒有上來寫東西了,今天隨便寫點東西和大家分享. 首先說一下負載均衡,相信大家都知道負載均衡可以很好地解決網站大流量的問題,負載均衡就是把用戶的請求分發 ...