代码规范
- enum 建议使用 NS_ENUM 和 NS_OPTIONS 宏来定义枚举类型
使用新版枚举
和上面的原因差不多,枚举应该使用新版的写法:
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
UIViewAnimationCurveEaseInOut,
UIViewAnimationCurveEaseIn,
UIViewAnimationCurveEaseOut,
UIViewAnimationCurveLinear
};
不仅能为枚举值指定类型,而且当赋值赋错类型时,编译器还会给出警告,没理由不用这种写法。
- 应避免使用基本类型,建议使用 Foundation 数据类型:
int -> NSInteger
unsigned -> NSUInteger
float -> CGFloat
动画时间 -> NSTimeInterval
数组的count是NSUInteger类型的,-1与其比较时隐式转换成NSUInteger,变成了一个很大的数字:
(lldb) p i
(int) $0 = -1
(lldb) p (NSUInteger)i
(NSUInteger) $1 = 18446744073709551615
- 替代Format字符串
适配64-bit时,你是否遇到了下面的恶心写法:
NSArray *items = @[@1, @2, @3];
NSLog(@“数组元素个数:%lu”, (unsigned long)items.count);
一般情况下,利用NSNumber的@语法糖就可以解决:
NSArray *items = @[@1, @2, @3];
NSLog(@“数组元素个数:%@”, @(items.count));
同理,int转string也可以:
NSInteger i = 10086;
NSString *string = @(i).stringValue;
当然,如需要%.2f这种Format就不适用了。
打印Mach-O文件支持的架构
如何看一个可执行文件是不是支持64-bit呢?
使用lipo -info命令,比如看看UIKit支持的架构:
// 当前在Xcode Frameworks目录
sunnyxx$ lipo -info UIKit.framework/UIKit
Architectures in the fat file: UIKit.framework/UIKit are: arm64 armv7s
想看的更详细的信息可以使用lipo -detailed_info:
sunnyxx$ lipo -detailed_info UIKit.framework/UIKit
Fat header in: UIKit.framework/UIKit
fat_magic 0xcafebabe
nfat_arch 2
architecture arm64
cputype CPU_TYPE_ARM64
cpusubtype CPU_SUBTYPE_ARM64_ALL
offset 4096
size 16822272
align 2^12 (4096)
architecture armv7s
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V7S
offset 16826368
size 14499840
align 2^12 (4096)
当然,还可以使用file命令:
sunnyxx$ file UIKit.framework/UIKit
UIKit.framework/UIKit: Mach-O universal binary with 2 architectures
UIKit.framework/UIKit (for architecture arm64):Mach-O 64-bit dynamically linked shared library
UIKit.framework/UIKit (for architecture armv7s):Mach-O dynamically linked shared library arm
上述命令对Mach-O文件适用,静态库.a文件,framework中的.a文件,自己app的可执行文件都可以打印下看看。
按照接口设计的惯例,如果设计了“初始化方法” (initializer),也应当搭配一个快捷构造方法。而快捷构造方法的返回值,建议为 instancetype,为保持一致性,init 方法和快捷构造方法的返回类型最好都用 instancetype。
如果基于第一种修改方法:既然该类中已经有一个“初始化方法” (initializer),用于设置“姓名”(Name)、“年龄”(Age)和“性别”(Sex)的初始值: 那么在设计对应 @property 时就应该尽量使用不可变的对象:其三个属性都应该设为“只读”。用初始化方法设置好属性值之后,就不能再改变了。在本例中,仍需声明属性的“内存管理语义”。于是可以把属性的定义改成这样