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