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實戰聯盟”哦~~~


IT實戰聯盟.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容