iOS小知识

1. 程序进入后台继续执行代码操作

在AppDelegate文件中创建一个属性
@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundUpdateTask;

并且在下面这个方法中实现你想要执行的代码

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self beingBackgroundUpdateTask];
    
    NSLog(@"你想要执行的代码");
    
    [self endBackgroundUpdateTask];

}

这是下面的两个方法的实现

- (void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    [self endBackgroundUpdateTask];
    }];
}
- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

2. 关键字

nullable:表示可以为空;
nonnull:表示不能为空;
null_resettable: get:不能返回为空,set可以为空;选择重写set或者get;
_Null_unspecified:不确定是否为空,暂时没发现有啥用;

  • 1__kindof:表示当前类或者它的子类;
  • 2__covariant(协变):用于泛型数据强转类型,可以向上强转,子类可以转成父类;
  • 3__contravariant(逆变):用于泛型数据强转类型,可以向下强转,父类可以转成子类;
@property (nonatomic,strong, nullable) NSString * name;
@property (nonatomic,strong) NSString * _Nullable stu;
@property (nonatomic,strong, null_resettable) NSString * name;
@property (nonatomic,strong) NSString * _Null_unspecified name;

3. 下载苹果官方字体库

地址:http://www.developer.apple.com/library/ios/#samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html


4. -w:禁止所有的编译警告;

 -Wno-unused-variable:只禁止未使用变量的  

的编译警告;

5. 使用函数式指针忽略警告


忽略警告:
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
        [_target performSelector:_action withObject:self];
#pragma clang diagnostic pop
如果需要忽视的警告有多处,可以定义一个宏:
#define IgnorePerformSelectorLeakWarning(Stuff) \  
do {\ _Pragma("clang diagnostic push") \ 
_Pragma("clang diagnostic ignored \
"-Warc-performSelector-leaks\"") \ 
Stuff; \ 
_Pragma("clang diagnostic pop") \ 
} while (0)
使用方法:
IgnorePerformSelectorLeakWarning( [_target performSelector:_action withObject:self]);

6.HTML字符转NSString

 //1.html转string
    NSString * htmlString = @"<html><body> Some html string \n <font size=\"13\" color=\"red\">This is some text!</font> </body></html>";
    NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
    UILabel * myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];
    myLabel.attributedText = attrStr;
    [self.view addSubview:myLabel];

7.判断是是否为PNG/GIF图片

//通过图片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;
}
  • 使用方法
    //假设这是一个网络获取的URL
    NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png";
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
    //调用获取图片扩展名
    NSString *string = [self contentTypeForImageData:data];
    //输出结果为 png
    NSLog(@"%@",string);

8.设置圆角的几种方法

  • 1.绘图
/** 设置圆形图片(放到分类中使用) */
- (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;
}
  • 1.1绘图传参
@implementation UIImage (RoundedCorner)
- (UIImage *)imageWithRoundedCornersAndSize:(CGSize)sizeToFit andCornerRadius:(CGFloat)radius
{
    CGRect rect = (CGRect){0.f, 0.f, sizeToFit};
    UIGraphicsBeginImageContextWithOptions(sizeToFit, NO, UIScreen.mainScreen.scale);
    CGContextAddPath(UIGraphicsGetCurrentContext(),
                     [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
    CGContextClip(UIGraphicsGetCurrentContext());
    [self drawInRect:rect];
    UIImage *output = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return output;
}
  • 2.圆角封装
    UIView * circleView = [UIView new];
    circleView.frame = CGRectMake(0, 0, 100, 100);
    circleView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]];
    [CircleImagePic getCircleImage:circleView cornerRadius:circleView.bounds.size.width/2];
    [self.view addSubview:circleView];

创建NSObject

+ (void)getCircleImage:(UIView *)circleView cornerRadius:(NSInteger)cornerRadius
{
    UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:circleView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(cornerRadius, 0)];
    CAShapeLayer * layer = [[CAShapeLayer alloc] init];
    layer.frame = circleView.bounds;
    layer.path = path.CGPath;
    circleView.layer.mask = layer;
    circleView.layer.cornerRadius = cornerRadius;
    circleView.layer.masksToBounds = YES;

}
  • 3.带缓存机制的圆角
    UIView * cacheImage = [UIView new];
    cacheImage.frame = CGRectMake(200, 0, 100, 100);
    cacheImage.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]];
    
    cacheImage.layer.masksToBounds = YES;
    cacheImage.layer.cornerRadius = cacheImage.bounds.size.width/2;
    cacheImage.layer.shouldRasterize = YES;
    cacheImage.layer.rasterizationScale = [UIScreen mainScreen].scale;
    [self.view addSubview:cacheImage];

9.移动文件


//    /Users/apple/Desktop/初始文件夹/Myfile

    //文件在哪个地方(文件夹)
    NSString *form = @"/Users/apple/Desktop/初始文件夹";
    //要剪切到什么地方
    NSString *to = @"/Users/apple/Desktop/移动到这里";
    
    NSFileManager *manager = [NSFileManager defaultManager];
    NSArray *subpaths =  [manager subpathsAtPath:form];
    NSDirectoryEnumerator *enumer = [manager enumeratorAtPath:to];
//    NSDirectoryEnumerator *enumer = [manager directoryContentsAtPath:form];
    
    for (NSDirectoryEnumerator *en in enumer) {
        NSLog(@"%@",en);
    }

    //创建队列(并发队列)
    dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
    
    NSInteger count = [subpaths count];
    dispatch_apply(count, queue, ^(size_t index) {
        
        NSString *subpath = subpaths[index];
        
        NSString *fullPath = [form stringByAppendingPathComponent:subpath];
        
        //拼接目标文件全路径
        NSString *fileName = [to stringByAppendingPathComponent:subpath];
        
        //剪切操作
        [manager moveItemAtPath:fullPath toPath:fileName error:nil];
        
    });

10.NSString与NSData互转

- (NSString *)hexStringFromData:(NSData*)data{  
    return [[[[NSString stringWithFormat:@"%@",data]  
              stringByReplacingOccurrencesOfString: @"<" withString: @""]  
             stringByReplacingOccurrencesOfString: @">" withString: @""]  
            stringByReplacingOccurrencesOfString: @" " withString: @""];  
}  
- (NSData*)dataFormHexString:(NSString*)hexString{  
    hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""];  
    if (!(hexString && [hexString length] > 0 && [hexString length]%2 == 0)) {  
        return nil;  
    }  
    Byte tempbyt[1]={0};  
    NSMutableData* bytes=[NSMutableData data];  
    for(int i=0;i<[hexString length];i++)  
    {  
        unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)  
        int int_ch1;  
        if(hex_char1 >= '0' && hex_char1 <='9')  
            int_ch1 = (hex_char1-48)*16;   //// 0 的Ascll - 48  
        else if(hex_char1 >= 'A' && hex_char1 <='F')  
            int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65  
        else  
            return nil;  
        i++;  
          
        unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)  
        int int_ch2;  
        if(hex_char2 >= '0' && hex_char2 <='9')  
            int_ch2 = (hex_char2-48); //// 0 的Ascll - 48  
        else if(hex_char2 >= 'A' && hex_char2 <='F')  
            int_ch2 = hex_char2-55; //// A 的Ascll - 65  
        else  
            return nil;  
          
        tempbyt[0] = int_ch1+int_ch2;  ///将转化后的数放入Byte数组里  
        [bytes appendBytes:tempbyt length:1];  
    }  
    return bytes;  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 1.避免循环引用 如果【block内部】使用【外部声明的强引用】访问【对象A】, 那么【block内部】会自动产生...
    木马不在转阅读 488评论 0 1
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 827评论 0 4
  • 以前工作中有很多小的知识点,但是有时候只是用了,没有真正积累下来,有时候也会忘记。所以写这篇文章就是慢慢的将以前小...
    FlyOceanFish阅读 1,495评论 3 34
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,074评论 1 23
  • 1代码中字符串换行 ​NSString *string = @"ABCDEFGHIJKL" \ ​"MNOPQRS...
    鄙人哈哈哈哈5871阅读 597评论 0 0