1. 隐式转换
NSArray *items = @[@1, @2, @3];
for (int i = -1; i < items.count; i++) {
NSLog(@"%d", i);
}
结果是,for循环一次都没有进。
数组的count是NSUInteger类型的,-1与其比较时隐式转换成NSUInteger,变成了一个很大的数字:
(lldb) p i
(int) $0 = -1
(lldb) p (NSUInteger)i
(NSUInteger) $1 = 18446744073709551615
for循环可以考虑写成:
for (NSUInteger index = 0; index < items.count; index++) {}
数组遍历还是更推荐用for-in
或block版本
的,
基本类型,比如下面4个类型在32-bit和64-bit下分别是多长呢?
size_t s1 = sizeof(int);
size_t s2 = sizeof(long);
size_t s3 = sizeof(float);
size_t s4 = sizeof(double);
结果为: 32-bit下:4, 4, 4, 8
;64-bit下:4, 8, 4, 8
(PS: 这个结果随编译器,换其他平台可不一定)
除非你明确知道自己在做什么,应该使用下面的类型代替基本类型:
int -> NSInteger
unsigned -> NSUInteger
float -> CGFloat
动画时间 -> NSTimeInterval
...
2. 倒叙遍历数组
NSArray *array = @[@1, @2, @3, @4];
//for-in倒叙遍历
for (NSString *string in [array reverseObjectEnumerator]) {
NSLog(@"------%@", string);
}
---------------------------
//使用block, 第一个参数: NSEnumerationOptions: NSEnumerationConcurrent(并发的/无序的)/NSEnumerationReverse(逆序)
---------------------------
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"====%@", obj);
}];
3. 使用block遍历key value
以下结果为无序
NSDictionary *dict = @{@"a": @"1", @"b": @"2", @"c": @"3", @"d": @"4", @"e": @"5"};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"key: %@, value: %@", key, obj);
}];
//并发获取key value
[dict enumerateKeysAndObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"key: ---%@|| value===%@", key, obj);
}];
4. NS_ENUM & NS_OPTIONS
NS_ENUM 和 NS_OPTIONS 都不算太古老的宏,在iOS 6 / OS X Mountain Lion才开始有,他们都是代替 enum 的更好的办法。
4.1 NS_ENUM
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
4.2 NS_OPTIONS
enum 也可以被定义为按位掩码(bitmask)。用简单的OR (|)和AND (&)数学运算即可实现对一个整型值的编码。每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 0、 1 << 1、 1 << 2等。如果你能够心算出每个数字的二进制表示法,例如:10110 代表 22,每一位都可以被认为是一个单独的布尔值。例如在UIKit中, UIViewAutoresizing 就是一个可以表示任何flexible top、bottom、 left 或 right margins、width、height组合的位掩码。
这个宏提示编译器值是如何通过位掩码 | 组合在一起的。同样的,注意值的区间不要超过所使用类型的最大容纳范围。
typedef NS_OPTIONS(NSUInteger, Test) {
TestA = 1 << 0,
TestB = 1 << 1,
TestC = 1 << 2,
TestD = 1 << 3
};
以使用按位与(&)判断枚举变量test是否赋值了枚举成员TestA
为例
Test test = TestA | TestB;
if (test & TestA){
NSLog(@"yes");
}else{
NSLog(@"no");
}
5. 在不越狱的情况下导出文件
直接通过iTunes将沙盒文件导出到电脑
,在plist文件
中添加Application supports iTunes file sharing = YES
参考
objc中国
NS_ENUM & NS_OPTIONS
参考sunnyxx博客
更多精彩内容请关注“IT实战联盟”哦~~~