iOS开发Tips

作者: 大慈大悲大熊猫 | 来源:发表于2015-07-27 14:20 被阅读239次

    介绍

    随着开发的进行,用到的一些小技巧和插件工具也越来越多。在这里统一的总结一下,方便查阅,时时更新。

    小技巧
    • 一个 GCC 非常模糊的特性,以及 Clang 也有的特性是,代码块如果在闭合的圆括号内的话,会返回最后语句的值。
    NSURL *url = ({ 
        NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint]; 
        [NSURL URLWithString:urlString];
    });
    

    这个特性非常适合组织小块的代码,通常是设置一个类。给出一个重要的入口并且减少相关干扰,能让代码聚焦于关键的变量和函数中。此外,这个方法有一个优点,所有的变量都在代码块中,也就是只在代码块的区域中有效,这意味着可以减少对其他作用域的命名污染。

    • 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
      如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
    __weak __typeof__(self) weakSelf = self;
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        __strong __typeof(self) strongSelf = weakSelf;
        if (strongSelf) { 
         [strongSelf doSomething]; 
         [strongSelf doSomethingElse]; 
        } else { 
         // Probably nothing... return; 
        }
    });
    

    在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成,调用第二个方法 doOtherThing 的时候,weakSelf 有可能被释放。即在没有循环引用的时候,block 是否被 retain 或者是一个属性都没关系。如果 block 被传递或者 copy 了,在执行的时候,weakSelf 可能会变成 nil。于是,strongSelf 就派上用场了,而__strong确保在 Block 内,strongSelf 不会被释放。

    Xcode插件

    1.ColorSense for Xcode - 用UIColor或者 NSColor的方法会弹出色盘和颜色角标,赞!
    2.Peckham - 能十分方便的在代码中引入头文件,支持模糊搜索,快捷键control+command+p。
    3.SCXcodeMinimap - 可以再代码侧面添加一个小地图,方便搜索的时候快速定位,快捷键control+shift+m。
    4.XToDo - 快速添加todo list(view ->snippets),且能精确查找todo,快捷键control+t。
    5.VVDocumenter - 快速注释,快捷键///。
    6.KSImageNamed - 自动在 imageNamed:方法后面列出项目里所有的文件名,带缩略图。
    7.HOStringSense - 格式化字符串,方便好用。
    8.FuzzyAutocompletePlugin - 方法名模糊匹配,提高效率的好工具。
    9.ClangFormat-Xcode - 一键格式化代码。

    几种处理JSON的工具or网站

    JSON校验
    JSON格式化工具
    json editor online

    图片压缩

    tinypng - 无损压缩,高效好用。

    调试接口

    Postman(chrome插件 - 见图)


    Postman
    注释

    几种常用的注释样式:

    @property (nonatomic ,strong) RHBankCard *bankCard;/**<银行卡信息*/
    @property (nonatomic ,strong) RHBankCard *bankCard;///<银行卡信息
    
    /**银行卡信息*/
    @property (nonatomic ,strong) RHBankCard *bankCard;
    
    typedef enum
    {
     ShareTypeSinaWeibo = 1,         /**< 新浪微博 */
     ShareTypeTencentWeibo = 2,      /**< 腾讯微博 */
     ShareTypeDouBan = 5,            /**< 豆瓣社区 */
     ShareTypeQQSpace = 6,           /**< QQ空间 */
    }
    ShareType;
    
    /**
     *  initWithStyle
     *
     *  @param style           style description
     *  @param reuseIdentifier reuseIdentifier description
     *
     *  @return self
     */
    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;
    

    前两种注释方式可以自由选择,让代码更美观。第三种是用在enum类型,第四种用的是喵神的VVDocumenter插件,适用于param多的方法。

    正确地定义常量

    以前定义常量都是用的#define,很简单也方便,从没想过可能出现的问题。一般这么定义:

    #define ANIMATION_DURATION_SHORT 0.3
    #define ANIMATION_DURATION_MIDDLE 0.6
    #define ANIMATION_DURATION_LONG 1.0
    

    这段代码是不是看起来很熟悉,在开发中也会经常用到。那么问题来了,宏定义只是简单地替换,即将一切宏定义替换成定义后面的内容,所以

    • 宏定义不会检查替换的“类型”,只要遇到,就做替换。
    • 宏定义不保证“不可变”,因为可以重复定义,不能保证值不变。

    所以,恰当的常量应该具备合适的名字、正确的类型,还有const、extern等关键字的修饰。例:

    //动画时间长度常量 
    static const NSTimeInterval kAnimationDurationLong = 1.0f;
    

    首先加static,限定在本文件中使用,确保不与其他的常量冲突,其次加const确保常量不被改变。若要定义一个全局变量,则在.h文件中用extern声明,在.m中定义,这样:

    //.h
    extern NSString * const PDUserInfoNotification;
    //.m
    NSString * const PDUserInfoNotification = @"PDUserInfoNotification";
    

    关于这点,更详细的可以看这里

    CGRect函数

    当访问CGRect里的x, y, width, 或 height时,应该使用CGGeometry函数而不是直接通过结构体来访问。引用Apple的CGGeometry:在这个参考文档中所有的函数,接受CGRect结构体作为输入,在计算它们结果时隐式地标准化这些rectangles。因此,你的应用程序应该避免直接访问和修改保存在CGRect数据结构中的数据。相反,使用这些函数来操纵rectangles和获取它们的特性。

    应该:

    CGRect frame = self.view.frame;
    CGFloat x = CGRectGetMinX(frame);
    CGFloat y = CGRectGetMinY(frame);
    CGFloat width = CGRectGetWidth(frame);
    CGFloat height = CGRectGetHeight(frame);
    CGRect frame = CGRectMake(0.0, 0.0, width, height);
    

    不应该:

    CGRect frame = self.view.frame;
    CGFloat x = frame.origin.x;
    CGFloat y = frame.origin.y;
    CGFloat width = frame.size.width;
    CGFloat height = frame.size.height;
    CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };
    

    黄金路径

    当使用条件语句编码时,左手边的代码应该是"golden" 或 "happy"路径。也就是不要嵌套if
    语句,多个返回语句也是OK。
    应该:

    - (void)someMethod { 
      if (![someOther boolValue])
       { 
            return; 
       } 
      //Do something important
    }
    

    不应该:

    - (void)someMethod {
     if ([someOther boolValue]) 
       { 
        //Do something important
       }
    }
    
    持续更新...

    相关文章

      网友评论

        本文标题:iOS开发Tips

        本文链接:https://www.haomeiwen.com/subject/mzsmqttx.html