zoukankan      html  css  js  c++  java
  • 网上收集的以及自己总结的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
  • 相关阅读:
    php无法保存cookies问题解决
    织梦(DEDECMS)首页调用相关投票的方法(自动更新)
    php导出任意mysql数据库中的表去excel文件
    学用.NET实现AutoCAD二次开发
    JS自动滚屏程序
    object c 的入门教程
    php如何截取字符串并以零补齐str_pad() 函数
    自己制作软键盘的几个关键技术解析
    php出现php_network_getaddresses的解决方法
    wamp环境下php命令运行时出现错误:无法启动此程序,因为计算机中丢失OCI.dll。尝试重新安装该程序以解决此问题
  • 原文地址:https://www.cnblogs.com/xiaobaizhu/p/5714357.html
Copyright © 2011-2022 走看看