iOS奇淫技巧总结

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

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

解决办法是:

$ cd /Applications
$ xattr -d com.apple.quarantine Xcode.app

打印调试Log

iOS 中有 DebugRelease 两种版本。

  • Debug:平时调试代码时使用的版本,体积大,支持设置断点调试,一般我们会在终端中打印一些调试信息等。
  • Release:正式发布的版本,不包含任何调试信息,体积小,运行速度快。

为了方便调试,一般情况下我们都会打印一些调试信息的 Log ,但是打印 Log 会影响执行速度,所以一般只在 Debug 版本打印 Log,而 Release 版本则不输出Log

代码这么多,难道每次发布前,都要一行一行的注释掉所有的调试信息吗?当然不是,这样太傻逼了。

iOS 中有一个宏定义 DEBUG 标志是否是 Debug 模式,因此我们可以控制只在 Debug 模式下才打印 Log

#if DEBUG
    print("debug log")
#else
    // do nothing
#endif

我封装了一个方法打印更多详细的信息。

public func jf_print<T>(_ items: T, _ file: String = #file, _ function: String = #function, _ line: Int = #line)
{
    #if DEBUG
        let now = Date().toString("yyyy-MM-dd HH:mm:ss:SSS")
        let bundleName = Bundle.main.bundleName
        let filename = file.split(separator: "/").last
        print("\(now) [\(bundleName!)] \(filename!)(\(line)) \(function) : \(items)")
    #endif
}

然而,Swift 项目中默认是不支持的,解决方法如下:

  • 在【Build Settings】中搜索 "Other Swift Flags"
  • Debug 分组添加 "-D" DEBUG
  • Release 分组添加 "-D" RELEASE

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 就可以让编译器显示警告信息,提示我们一些糟糕的代码有待修改,方便定位代码位置。

但 Swift 中并没有实现该编译器特性,虽然有 TODO: FIXME: 等关键字,但仅仅是在 jumping bar 上有高亮提示,并没有警告信息。

解决方法如下:

  • 【项目设置】-->【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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,874评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,151评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,270评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,137评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,116评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,935评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,261评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,895评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,342评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,854评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,978评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,609评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,181评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,182评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,402评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,376评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,677评论 2 344

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,022评论 4 62
  • 周末带龙宝哥哥、羊宝妞妞和姥姥、姥爷去公园玩,原本perfect的活动计划被突如其来的偷窃打乱,装着钱包、证件、车...
    小百妈妈阅读 378评论 0 0
  • ​模式名称:增加正能量(Accentuate the positive) 总结: 在变革的举措中,要尝试影响其他人...
    from1to100阅读 123评论 0 0