1、dispatch_after及NSTimer造成对象无法释放
2、宏定义##
与#
3、Swift实现原子属性
4、Xcode图像化调试错误
5、UITabBarController调用viewDidLoad的时机
dispatch_after及NSTimer造成对象无法释放
dispatch_after:
- 由于dispatch_after会持有block内的对象,所以会使这个对象延迟释放。使用时最好能确保block内的对象都是weak的,这样不容易出问题。
NSTimer:
- NSTimer在手动停止或截止时间点到达前,是不会释放的。所以为了能让使用NSTimer的对象能够顺利释放自身,最好对NSTimer使用__weak关键字,并且在dealloc时,手动停止NSTimer。如下:
1 | ... |
宏定义##
与#
##
链接符将两个字串连接起来
- “##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。
预处理器一般把
空格
解释成分段标志,对于每一段和前面比较,相同的就被替换。这样做的结果是, 被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些 ##来替代空格。另外一些分隔标志是,包括操作符,比如 +, -, *, /, [,], …,
强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来
1 | #define A1(name, type) type name_##type##_type |
#
- 对这个变量替换后,添加双引号
1 | // 在打印枚举名时很好用 |
Swift实现原子属性
1 |
|
实际上感觉原子属性的作用并不是很明显,对一个多步操作,还是需要自己手动加锁。
Xcode图像化调试错误
报错:
1 | Assertion failure in -[UITextView _firstBaselineOffsetFromTop], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.60.7/UITextView.m:1683 |
添加以下代码即可:
1 |
|
或者
1 |
|
UITabBarController调用viewDidLoad的时机
继承UITabBarController后,从外部调用init创建,即使没有加载它的view,它也会调用viewDidLoad,这点和UIViewController不一样。
所以在使用Swift时,需要注意在UITableBarController中声明为!类型的属性,容易造成强制解包崩溃的问题。
详细信息