当前位置: 首页 > news >正文

网上收集的以及自己总结的iOS开发技巧

Objective-C

1.让Xcode的控制台支持LLDB类型的打印

这有什么用?

怎么说尼,笔者认为这个还是比较有用滴,为什么有用尼?

因为在Xcode断点调试的时候, 在控制台输入 po self.view.frame 或者 po id 类型的时候就死翘翘了。
不信? 看如下图 :

1.png

进入正题

打开终端输入三条命令:

1. touch ~/.lldbinit

2. echo display @import UIKit >> ~/.lldbinit

3. echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit

输完命令后没有任何提示? 好吧, 那恭喜你成功了~! 然后, 最关键的一步来了, 那就是…

重新运行项目(不用重启Xcode也可以),看如下图~~

QQ截图20151231145404.png

就代表成功啦

那么现在我们继续在控制台输入po self.view.frame

QQ截图20151231145414.png

成功了!如果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,就可以了。

256780-803deeacec833571.png

问题原因:imageNamed读取图片的方法,会缓存在内存中,所以较大的图片,还是用imageWithContentsOfFile。

Tip1:.xcassets里的图片无法用imageWithContentsOfFile读取;

Tip2:imageWithContentsOfFile读取图片需要加文件后缀名如png,jpg等;

6.在控制台里打印controller的层级

 

在控制台里使用po [UIViewController _printHierarchy]命令即可打印出controller的层级,一目了然.大家都去玩玩吧~~1

02.png

7.在控制台里打印view的层级

 

在控制台里使用po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]命令即可打印出view的层级,一目了然。

 

当然,可能对于某一些人来说打印window下的所有view层级,会觉得眼花缭乱。

 

但是,也可以打印指定某一个view的层级。

 

po [view recursiveDescription]

8.在debug模式下的控制台里使用po命令打印对象的属性和值

添加分类,加上代码即可。不用导入头文件,即可在控制台里使用po命令打印出model的属性和值,这个方法主要使用方法欺骗的手段,替换系统的description方法
400.png

 

 

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

 

转载于:https://www.cnblogs.com/xiaobaizhu/p/5714357.html

相关文章:

  • Groovy学习随笔之一
  • 归纳总结Android的点击事件
  • 关于从子窗口获取内容并填充到父窗口元素中的方法
  • msyql sql优化一列
  • 项目同步部署
  • Nessus的安装/激活/更新
  • tail
  • Nginx和Nginx+的比较(上)
  • JDBC+Servlet+JSP整合开发之25.JSP动作元素
  • mysql基础(3)-高级查询
  • SpringMVC3.1.1+Spring3.1.1+Hibernate4+Velocity+EasyUI+ZTree实现RBAC基于角色的访问控制(二)...
  • 设置RMAN的备份路径
  • uboot移植(三)——uboot mkconfig脚本分析
  • .NET文档生成工具ADB使用图文教程
  • Java中Enum枚举的使用
  • __proto__ 和 prototype的关系
  • 78. Subsets
  • canvas 高仿 Apple Watch 表盘
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • java8-模拟hadoop
  • JavaScript设计模式系列一:工厂模式
  • php ci框架整合银盛支付
  • rc-form之最单纯情况
  • SegmentFault 2015 Top Rank
  • spring学习第二天
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • windows下mongoDB的环境配置
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 经典排序算法及其 Java 实现
  • 前端自动化解决方案
  • 事件委托的小应用
  • 学习ES6 变量的解构赋值
  • ionic异常记录
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 正则表达式-基础知识Review
  • ​如何在iOS手机上查看应用日志
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #《AI中文版》V3 第 1 章 概述
  • #Lua:Lua调用C++生成的DLL库
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (理论篇)httpmoudle和httphandler一览
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (七)c52学习之旅-中断
  • (一)VirtualBox安装增强功能
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .“空心村”成因分析及解决对策122344
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @FeignClient注解,fallback和fallbackFactory
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AX]AX2012开发新特性-禁止表或者表字段