iOS常见问题(一)

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-inblock版本的,

基本类型,比如下面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实战联盟”哦~~~


iOS常见问题(一)_第1张图片
IT实战联盟.jpg

你可能感兴趣的:(iOS常见问题(一))