iOS 開發中你是否遇到這些經驗問題

1.用斷點調試崩潰問題的小技巧

(1)如果當前斷點指向內存, 那麼就是初始化時分配內存時有問題

(2)添加全局斷點的問題:

2353624-6e6f508188bfe97a.png

全局斷點的目的就是當產生異常或崩潰能夠停留在異常或者崩潰發生的地方而不是跳轉到主函數

1471576838158911.png

但是添加全局斷點後會跳轉到主函數, 會遇到如上圖的情況, 那麼80%的問題就是storyboard或者xib拖線沒有及時清理掉壞線如下圖:

2353624-5c4a15bb16ed6d32.png

這條Button的連線在代碼中已經刪除了不用了, 但是沒有及時清理掉,所以會造成崩潰!

2.判斷是否爲gif/png圖片的正確姿勢

首先我們先想想如果是你, 你會怎麼去判斷一個從網絡獲取的圖片URL是否爲gif圖片, 是否是這樣呢 ? 如下:

1
2
3
4
5
6
7
8
9
//假設這是一個網絡獲取的URL
// 判斷是否爲gif
NSString *extensionName = path.pathExtension;
if ([extensionName.lowercaseString isEqualToString:@"gif"]) {
    //是gif圖片
else {
    //不是gif圖片
 }

什麼難道你不是這麼判斷的麼 ? 哦~ 我懂了, 難道你使用字符串截取來判斷的嗎 ? 哈哈開個玩笑!

以上判斷看似是可以的,但是這不嚴謹的, 在不知道圖片擴展名的情況下, 如何知道圖片的真實類型 ? 其實就是取出圖片數據的第一個字節, 就可以判斷出圖片的真實類型那該怎麼做呢如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//通過圖片Data數據第一個字節 來獲取圖片擴展名
- (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];
    switch (c) {
        case 0xFF:
            return @"jpeg";
        case 0x89:
            return @"png";
        case 0x47:
            return @"gif";
        case 0x49:
        case 0x4D:
            return @"tiff";
        case 0x52:
            if ([data length] < 12) {
                return nil;
            }
            NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
            if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                return @"webp";
            }
            return nil;
    }
    return nil;
}

其實圖片數據的第一個字節是固定的,一種類型的圖片第一個字節就是它的標識, 我們來調用一下這個方法:

1
2
3
4
5
6
7
//假設這是一個網絡獲取的URL
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
//調用獲取圖片擴展名
NSString *string = [self contentTypeForImageData:data];
//輸出結果爲 png
NSLog(@"%@",string);

3.你是用什麼方法設置圖片圓角?

首先你是否是這麼設置的:

1
2
3
//cornerRadius 設置爲self.iconImage圖片寬度的一半(圓形圖片)
self.iconImage.layer.cornerRadius = 20;
self.iconImage.layer.masksToBounds = YES;

或者是在xib&storyboard中點擊要設置圓角的圖片:

2353624-cce526062c2d783a.png

在此之後建議大家儘量不要這麼設置, 因爲使用圖層過量會有卡頓現象, 特別是弄圓角或者陰影會很卡, 如果設置圖片圓角我們一般用繪圖來做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** 設置圓形圖片(放到分類中使用) */
- (UIImage *)cutCircleImage {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
    // 獲取上下文
    CGContextRef ctr = UIGraphicsGetCurrentContext();
    // 設置圓形
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextAddEllipseInRect(ctr, rect);
    // 裁剪
    CGContextClip(ctr);
    // 將圖片畫上去
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

這個方法就是設置圓角圖片, 效率很高, 不會造成卡頓現象, 大家要把這個方法單獨放到分類中使用


發佈了12 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章