美文网首页
iOS常见问题(一)

iOS常见问题(一)

作者: simuty | 来源:发表于2016-07-22 16:24 被阅读0次

    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实战联盟”哦~~~


    IT实战联盟.jpg

    相关文章

      网友评论

          本文标题:iOS常见问题(一)

          本文链接:https://www.haomeiwen.com/subject/jnuijttx.html