iOS奇淫技巧总结

作者: jumpingfrog0 | 来源:发表于2017-01-05 19:39 被阅读522次

    Xcode 卡住在 'Verifying Xcode...'界面

    更新完 Xcode 或安装多个 Xcode后,第一次打开有时会卡住在 "Verifying Xcode..."界面

    Swift桥接文件 import <xx/xx.h> file not found的问题

    Objective-C 和 Swift 混编时需要在桥接文件xxx-Bridging-Header.h中引入相关的头文件,但头文件的命名只能是字母,不能出现其他字符。

    比如想引入:UITableView+FDTemplateLayoutCell

    不能直接这样写:

    #import <UITableView-FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell.h>
    

    会提示错误 file not found

    解决方法:

    点击 【pods】-->【targets】-->【build settings】,搜索 "Packaging",找到 "Product Name",发现是 UITableView_FDTemplateLayoutCell

    在桥接文件中改为

    #import <UITableView_FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell.h>
    

    即可。

    如果你用的是 cocopods 1.1.1或以上Xcode 8,不用在桥接文件中引入,直接在需要用到的地方

    import UITableView_FDTemplateLayoutCell
    

    即可。

    Swift中的编译器警告

    在 Objective-C 中使用 #warning 就可以让编译器显示警告信息,提示我们一些糟糕的代码有待修改,方便定位代码位置。

    解决方法如下:

    • 【项目设置】-->【targets】-->【Build Phases】--> '+' --> 【New Run Script Phase】
    • 把下面的代码粘贴到 【shell】中
    if [ "${CONFIGURATION}" = "Debug" ]; then
    TAGS="TODO:|FIXME:"
    echo "searching ${SRCROOT} for ${TAGS}"
    find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
    fi
    

    你也可以使用 "Release" 替换 "Debug" 只在正式的编译版本中显示警告信息

    重新编译就能在 Xcode 的侧边栏看到警告信息了。

    消除弃用API的编译器警告

    在 Objective-C 中,有些警告不可避免,比如为了兼容旧版本,使用了弃用的API,但看着一大堆的警告又特别烦人,可以使用 #pragma clang diagnostic 消除编译器警告。

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        // some deprecated code
        ...
    #pragma clang diagnostic pop
    

    Swift3.0 中则可以使用 #available 来检测API是否可用。参考 The Swift Programming Language

    if #available(iOS 10, macOS 10.12, *) {
        // Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS
    } else {
        // Fall back to earlier iOS and macOS APIs
    }
    

    标记一个function/method为弃用

    随着版本迭代,某些方法会被弃用。

    直接删掉?万一下次用到怎么办?

    注释掉?强迫症不喜欢看到大段的注释代码。

    Swift 和 Objective-C 提供了一种弃用 function/method 的方法。

    Swift版本

    Swift 中弃用某个方法使用的是 @available attribute

    @available(*, introduced: 2.0, deprecated: 9.0, message: "no longer needed.")
    func method() {
        ...
    }
    

    效果如下:

    Objective-C/GCC版本

    __attribute__((deprecated))gcc 用来标记 function/method 弃用的方式(同样适用于 clang)

    普通函数的语法
    __attribute__((deprecated))
    void f(...) {
      ...
    }
    
    // gcc 4.5+ / clang
    __attribute__((deprecated("g has been deprecated please use g2 instead")))
    void g(...) {
      ...
    }
    
    Objective-C的语法
    // 弃用一个方法
    @interface MyClass : NSObject { ... }
    -(void)f:(id)x __attribute__((deprecated));
    ...
    @end
    
    // 弃用一个类
    __attribute__((deprecated))
    @interface DeprecatedClass : NSObject { ... }
    ...
    @end
    

    当然你也可以使用更具有可读性的 DEPRECATED_ATTRIBUTE

    usr/include/AvailabilityMacros.h,苹果定义了两个宏

    #define DEPRECATED_ATTRIBUTE        __attribute__((deprecated))
    #define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))
    

    示例:

    // 弃用一个方法
    @interface MyClass : NSObject { ... }
    -(void)foo:(id)x DEPRECATED_ATTRIBUTE;
    
    // 弃用一个方法,并指定一个提示信息
    -(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");
    ...
    @end
    
    // 弃用一个类
    DEPRECATED_ATTRIBUTE
    @interface DeprecatedClass : NSObject { ... }
    ...
    @end
    

    参考链接:

    How to deprecate a method in Xcode

    Swift: #warning equivalent

    相关文章

      网友评论

        本文标题:iOS奇淫技巧总结

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