OC中一些常用函数

1,过滤html中的标签,返回字符串:

+ (NSString *)removeHTML2:(NSString *)html{
    //过滤nsstring中html标签
    NSArray *components = [html componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    
    NSMutableArray *componentsToKeep = [NSMutableArray array];
    
    for (int i = 0; i < [components count]; i = i + 2) {
        
        [componentsToKeep addObject:[components objectAtIndex:i]];
        
    }
    
    NSString *plainText = [componentsToKeep componentsJoinedByString:@""];
    
    return plainText;
    
}

2,ios设备获取自身IP:

//add  #include <sys/socket.h> 
+ (NSString*) getIPAddress
{
    NSString* address;
    struct ifaddrs *interfaces = nil;
    
    // get all our interfaces and find the one that corresponds to wifi
    if (!getifaddrs(&interfaces))
    {
        for (struct ifaddrs* addr = interfaces; addr != NULL; addr = addr->ifa_next)
        {
            if (([[NSString stringWithUTF8String:addr->ifa_name] isEqualToString:@"en0"]) &&
                (addr->ifa_addr->sa_family == AF_INET))
            {
                struct sockaddr_in* sa = (struct sockaddr_in*) addr->ifa_addr;
                address = [NSString stringWithUTF8String:inet_ntoa(sa->sin_addr)];
                break;
            }
        }
    }
    freeifaddrs(interfaces);
    return address;
}

3,另外一种获取IP的方法;

#import <sys/socket.h>
#import <sys/sockio.h>
#import <sys/ioctl.h>
#import <net/if.h>
#import <arpa/inet.h>
//
- (NSArray *)getIpAddresses {
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) return nil;
    NSMutableArray *ips = [NSMutableArray array];
    
    int BUFFERSIZE = 4096;
    struct ifconf ifc;
    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    struct ifreq *ifr, ifrcopy;
    ifc.ifc_len = BUFFERSIZE;
    ifc.ifc_buf = buffer;
    if (ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){
        for (ptr = buffer; ptr < buffer + ifc.ifc_len; ){
            ifr = (struct ifreq *)ptr;
            int len = sizeof(struct sockaddr);
            if (ifr->ifr_addr.sa_len > len) {
                len = ifr->ifr_addr.sa_len;
            }
            ptr += sizeof(ifr->ifr_name) + len;
            if (ifr->ifr_addr.sa_family != AF_INET) continue;
            if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) *cptr = 0;
            if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) continue;
            memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
            ifrcopy = *ifr;
            ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
            if ((ifrcopy.ifr_flags & IFF_UP) == 0) continue;
            
            NSString *ip = [NSString stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr)];
            [ips addObject:ip];
        }
    }
    close(sockfd);
    return ips;
}
//获取的数组两个值,第一个是本地地址,127.0.0.1也就是localhost,第二个是路由器DNS分配的公网地址。

4,去掉字符串中的空格。

//
//stringByReplacingOccurrencesOfString字符串替换方法,将空格替换为空
NSString *string = [sourceString stringByReplacingOccurrencesOfString:@" " withString:@""];
//去掉左右两边的空格
NSString *string = [sourceString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
//去掉左右两边的空格和换行
NSString *string = [sourceString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

5,NSString转换成char类型。

//
//NSString转换 char *
NSString *str4 = @"啊啊啊啊啊";
const char *cstr = [str4 UTF8String];//加const 里边内容不能改变。
printf("%s",cstr);
//因为nsstring是不可变字符串。cstr就是指向字符数组的一个指针。
//将char类型数组转换为nsstring类型的。
NSString *string =  [[NSString alloc] initWithCString:(const char*)cstr encoding:NSUTF8StringEncoding];
NSLog(@"string - - %@",string);

6,将字符串转换成数组

//
NSString *sourceStr = @"a,c,d,f,e,g";
NSArray *strarr = [sourceStr componentsSeparatedByString:@“,”];//通过,进行分割,元素里则没有,逗号。
//
/*===数组转换成字符串===*/
//将一个数组转换成一个字符串,通过指定的字符进行分割。两个参数,第一个是要数组,第二个是用什么字符串分割。
NSMutableString * stringFromArray(NSArray * array,NSString * string){
    NSMutableString *resultString = [NSMutableString string];
    for (int i = 0; i < [array count]; i++) {
        [resultString appendString:array[i]];
        if(i < [array count] - 1){
        [resultString appendString:string];
        }
    }
    return resultString;
}

7,通过属性获取当前属性的类型。

//
static const char * getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T' && attribute[1] != '@') {
            // it's a C primitive type:
            /*
             if you want a list of what will be returned for these primitives, search online for
             "objective-c" "Property Attribute Description Examples"
             apple docs list plenty of examples of what you get for int "i", long "l", unsigned "I", struct, etc.
             */
            return (const char *)[[NSData dataWithBytes:(attribute + 1) length:strlen(attribute) - 1] bytes];
        }
        else if (attribute[0] == 'T' && attribute[1] == '@' && strlen(attribute) == 2) {
            // it's an ObjC id type:
            return "id";
        }
        else if (attribute[0] == 'T' && attribute[1] == '@') {
            // it's another ObjC object type:
            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
        }
    }
    return "";
}

8,sqlite3判断当前库中数据表是否存在:

//
//判断当前数据库是否有此表
- (BOOL)isExistTable:(NSString *)tableName
{
    int exResult = NO;
    NSString *sql = [NSString stringWithFormat:@"SELECT COUNT(*) as 'count' FROM sqlite_master where type='table' and name='%@';",tableName];
    const char *sql_stmt = [sql UTF8String];
    sqlite3_stmt *statement;
    if(sqlite3_prepare_v2(db, sql_stmt, -1, &statement, nil) == SQLITE_OK){
        exResult = sqlite3_step(statement) == SQLITE_ROW;
        NSInteger count= sqlite3_column_int(statement, 0);
        exResult = count == 1 ? YES : NO;
    }else{
        exResult = NO;
    }
    return exResult;
}

9,NSData转换NSArray,相互转换:

//
NSArray *tmpArray = @[@"1",@"2",@"3"];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:tmpArray];
NSArray *exchangeArray = NSKeyedUnarchiver unarchiveObjectWithData:data];

10,分别获取当前时间的年,月,日,周等分离数据。

//
+ (NSDateComponents *)nowDateComponents
{
    NSDate *dt = [NSDate date];
    NSCalendar *cl = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSUInteger flag = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal;
    return [cl components:flag fromDate:dt];
} 
//
NSDateComponents *comp = [PublicFunction nowDateComponents];
        NSString *weekDay = [NSString string];
        switch (comp.weekday) {
            case 1:
                weekDay = @"日";
                break;
            case 2:
                weekDay = @"一";
                break;
            case 3:
                weekDay = @"二";
                break;
            case 4:
                weekDay = @"三";
                break;
            case 5:
                weekDay = @"四";
                break;
            case 6:
                weekDay = @"五";
                break;
            case 7:
                weekDay = @"六";
                break;
            default:
                break;
        }
        NSString *dateText = [NSString stringWithFormat:@"%ld月%ld日  星期%@",comp.month,comp.day,weekDay];

11,NSString改变字符串的大小写:

//字符串所有字符变为小写
NSString *lowerCaseString2 = testString.lowercaseString;  
      
//字符串所有字符变为大写
NSString *upperCaseString2 = lowerCaseString1.uppercaseString;

12,UIView转换成UIImage。

//
-(UIImage*)convertViewToImage
{
    CGSize size = self.bounds.size;
    UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
    
}
- (UIImage *)screenshotWithRect:(CGRect)rect optionScale:(CGFloat)scale
{
    CGFloat optionScale = scale <= 0 ? [UIScreen mainScreen].scale : scale;
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, optionScale);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (context == NULL)
    {
        return nil;
    }
 
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
    /*
    if( [self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
    {
        //截view
        [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
    }else
    {
        //截view.layer
        [self.layer renderInContext:context];
    }
    */
    [self.layer renderInContext:context];
    CGContextRestoreGState(context);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

13,获取农历的日历

+ (NSDictionary *)LunarForSolar
{
    
    //天干名称
    
    NSArray *cTianGan = [NSArray arrayWithObjects:@"甲",@"乙",@"丙",@"丁",@"戊",@"己",@"庚",@"辛",@"壬",@"癸", nil];
    
    
    
    //地支名称
    
    NSArray *cDiZhi = [NSArray arrayWithObjects:@"子",@"丑",@"寅",@"卯",@"辰",@"巳",@"午",@"未",@"申",@"酉",@"戌",@"亥",nil];
    
    
    
    //属相名称
    
    NSArray *cShuXiang = [NSArray arrayWithObjects:@"鼠",@"牛",@"虎",@"兔",@"龙",@"蛇",@"马",@"羊",@"猴",@"鸡",@"狗",@"猪",nil];
    
    
    
    //农历日期名
    
    NSArray *cDayName = [NSArray arrayWithObjects:@"*",@"初一",@"初二",@"初三",@"初四",@"初五",@"初六",@"初七",@"初八",@"初九",@"初十",
                         
                         @"十一",@"十二",@"十三",@"十四",@"十五",@"十六",@"十七",@"十八",@"十九",@"二十",
                         
                         @"廿一",@"廿二",@"廿三",@"廿四",@"廿五",@"廿六",@"廿七",@"廿八",@"廿九",@"三十",nil];
    
    
    
    //农历月份名
    
    NSArray *cMonName = [NSArray arrayWithObjects:@"*",@"正",@"二",@"三",@"四",@"五",@"六",@"七",@"八",@"九",@"十",@"十一",@"腊",nil];
    
    
    
    //公历每月前面的天数
    
    const int wMonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
    
    
    
    //农历数据
    
    const int wNongliData[100] = {2635,333387,1701,1748,267701,694,2391,133423,1175,396438
        
        ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402
        
        ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738
        
        ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762
        
        ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413
        
        ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395
        
        ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031
        
        ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222
        
        ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709
        
        ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};
    
    
    
    static NSInteger wCurYear,wCurMonth,wCurDay;
    
    static NSInteger nTheDate,nIsEnd,m,k,n,i,nBit;
    
    
    
    //取当前公历年、月、日
    
    NSDateComponents *components = [self nowDateComponents];
//    [[NSCalendarcurrent Calendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnitfromDate:solarDate];
    
    
    wCurYear = [components year];
    
    wCurMonth = [components month];
    
    wCurDay = [components day];
    
    
    
    //计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
    
    nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38;
    
    if((!(wCurYear % 4)) && (wCurMonth > 2))
        
        nTheDate = nTheDate + 1;
    
    
    
    //计算农历天干、地支、月、日
    
    nIsEnd = 0;
    
    m = 0;
    
    while(nIsEnd != 1)
        
    {
        
        if(wNongliData[m] < 4095)
            
            k = 11;
        
        else
            
            k = 12;
        
        n = k;
        
        while(n>=0)
            
        {
            
            //获取wNongliData(m)的第n个二进制位的值
            
            nBit = wNongliData[m];
            
            for(i=1;i<n+1;i++)
                
                nBit = nBit/2;
            
            
            
            nBit = nBit % 2;
            
            
            
            if (nTheDate <= (29 + nBit))
                
            {
                
                nIsEnd = 1;
                
                break;
                
            }
            
            
            
            nTheDate = nTheDate - 29 - nBit;
            
            n = n - 1;
            
        }
        
        if(nIsEnd)
            
            break;
        
        m = m + 1;
        
    }
    
    wCurYear = 1921 + m;
    
    wCurMonth = k - n + 1;
    
    wCurDay = nTheDate;
    
    if (k == 12)
        
    {
        
        if (wCurMonth == wNongliData[m] / 65536 + 1)
            
            wCurMonth = 1 - wCurMonth;
        
        else if (wCurMonth > wNongliData[m] / 65536 + 1)
            
            wCurMonth = wCurMonth - 1;
        
    }
    
    
    
    //生成农历天干、地支、属相
    
    NSString *szShuXiang = (NSString *)[cShuXiang objectAtIndex:((wCurYear - 4) % 60) % 12];
    
    //NSString *szNongli = [NSString stringWithFormat:@"%@(%@%@)年",szShuXiang, (NSString *)[cTianGan objectAtIndex:((wCurYear - 4) % 60) % 10],(NSString *)[cDiZhi objectAtIndex:((wCurYear - 4) % 60) % 12]];
    
    
    //生成农历月、日
    
    NSString *szNongliDay;
    
    if (wCurMonth < 1){
        
        szNongliDay = [NSString stringWithFormat:@"闰%@",(NSString *)[cMonName objectAtIndex:-1 * wCurMonth]];
        
    }
    
    else{
        
        szNongliDay = (NSString *)[cMonName objectAtIndex:wCurMonth];
        
    }
    
    
    
    //NSString *lunarDate = [NSString stringWithFormat:@"%@ %@月 %@",szNongli,szNongliDay,(NSString *)[cDayName objectAtIndex:wCurDay]];
    
 
    NSDictionary *nongliDic = @{@"shuxiang":szShuXiang,
                                @"nongliYear":[NSString stringWithFormat:@"%@%@",(NSString *)[cTianGan objectAtIndex:((wCurYear - 4) % 60) % 10],(NSString *)[cDiZhi objectAtIndex:((wCurYear - 4) % 60) % 12]],
                                @"month":szNongliDay,
                                @"day":[NSString stringWithFormat:@"%@",[cDayName objectAtIndex:wCurDay]]};
    //
    return nongliDic;
    
}

14,gif图播放。

//web url with gif
+ (CAKeyframeAnimation *)gifWithURL:(NSString *)url duration:(float)duration repeatCount:(float)repeatCount beginTime:(CFTimeInterval)beginTime atComplateRemove:(BOOL)remove
{
    CGImageSourceRef  cImageSource = [self CGImageSourceCreateWithURL:url];
    size_t imageCount = CGImageSourceGetCount(cImageSource);
    NSMutableArray *images = [[NSMutableArray alloc] initWithCapacity:imageCount];
    NSMutableArray *times = [[NSMutableArray alloc] initWithCapacity:imageCount];
    NSMutableArray *keyTimes = [[NSMutableArray alloc] initWithCapacity:imageCount];
    CGFloat totalTime = 0;
    for (size_t i = 0; i < imageCount; i++) {
        CGImageRef cgimage= CGImageSourceCreateImageAtIndex(cImageSource, i, NULL);
        [images addObject:(__bridge id)cgimage];
        CGImageRelease(cgimage);
        
        NSDictionary *properties = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cImageSource, i, NULL);
        NSDictionary *gifProperties = [properties valueForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
        NSString *gifDelayTime = [gifProperties valueForKey:(__bridge NSString* )kCGImagePropertyGIFDelayTime];
        [times addObject:gifDelayTime];
        totalTime += [gifDelayTime floatValue];
        
    }
    
    float currentTime = 0;
    for (size_t i = 0; i < times.count; i++) {
        float keyTime = currentTime / totalTime;
        [keyTimes addObject:[NSNumber numberWithFloat:keyTime]];
        currentTime += [[times objectAtIndex:i] floatValue];
    }
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:StickerAnimationByContents];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    [animation setValues:images];
    [animation setKeyTimes:keyTimes];
    animation.beginTime = beginTime;
    animation.removedOnCompletion = remove;
    animation.fillMode = kCAFillModeForwards;
    animation.duration = duration;
    //totalTime;
    animation.repeatCount = repeatCount;
    return animation;
}
 
+ (CGImageSourceRef)CGImageSourceCreateWithURL:(NSString *)url
{
    NSData *gifData = [[YYImageCache sharedCache] getImageDataForKey:url];
    CGImageSourceRef cImageSource = CGImageSourceCreateWithData((CFDataRef)gifData, NULL);
    return cImageSource;
}

15,数据请求中,对URL进行转码,否则服务器找不到地址:

//格式化URL
+(NSString *)encodeUrl:(NSString *)sourceURL
{
    if (System_Version_Later(9.0)) {
        return [sourceURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    }else{
        return [sourceURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
    }
}

16,循环请求数据,请求完主线程进行添加,请求为异步:

    NSMutableArray<NSNumber *> *stars = [NSMutableArray array];
    dispatch_group_t starRequestGroup = dispatch_group_create();
    dispatch_queue_t searialQueue = dispatch_queue_create("com.santong.starRequestQueue", DISPATCH_QUEUE_SERIAL);
    for (NSInteger i = 0; i < 4; i++) {
        dispatch_group_enter(starRequestGroup);
        dispatch_group_async(starRequestGroup, searialQueue, ^{
            [self SL_MyInfoStarsParams:@{@"starId":@(i)} willRequestHandle:nil atComplateHandle:^(NSError * _Nonnull error, SLSuperModel * _Nonnull superModel) {
                dispatch_group_leave(starRequestGroup);
                if(error == nil && RequestSucceedCode == superModel.code){
                    [stars addObject:superModel.obj];
                }else{
                    [stars addObject:@(0)];
                }
            }];
        });
    }
    
    WeakSelf(weakSelf);
    dispatch_group_notify(starRequestGroup, searialQueue, ^{
        //分配
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf.meCtrl.headerView setStarsWithArray:stars.copy];
        });
    });

17,UITextView加入html富文本之后计算其高度:

  NSData *data = [htmlString dataUsingEncoding:NSUnicodeStringEncoding];
    NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSAttributedString *html = [[NSAttributedString alloc]initWithData:data
                                                               options:options
                                                    documentAttributes:nil
                                                                 error:nil];
    
    CGRect rect = [html boundingRectWithSize:CGSizeMake(ScreenWidth - ScaleForLengthWith2(24.0) * 2, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingUsesDeviceMetrics context:nil];
    CGFloat finalHeight = ceil(rect.size.height) + 8;
//    NSLog(@"%@",NSStringFromCGRect(rect));
    self.textView.attributedText = html;

18,AutoLayout自适应TableViewCell之后,获取整个TableView的ContentSize:

[weakSelf.listTableView layoutIfNeeded];
weakSelf.listTableView.frame = CGRectMake(0, 0, weakSelf.listTableView.width, msgTableView.contentSize.height);
NSLog(@"contentSize = = = %lf",msgTableView.contentSize.height);

19,SDImageCache获取缓存图片

SDImageCache通过URL获取缓存图片:
1,通过URL获取当前项目缓存中的图片路径,返回NSString:
[[SDImageCache sharedImageCache] defaultCachePathForKey:url];
2,通过URL获取当前项目缓存中的图片,返回UIImage:
[[SDImageCachesharedImageCache] imageFromDiskCacheForKey:url];

20,提取URL中的参数及参数值:

- (NSMutableDictionary *)parseURLParameters:(NSString *)url{

    NSRange range = [url rangeOfString:@"?"];
    if (range.location == NSNotFound) return nil;
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    NSString *parametersString = [url substringFromIndex:range.location + 1];
    if ([parametersString containsString:@"&"]) {
        NSArray *urlComponents = [parametersString componentsSeparatedByString:@"&"];
        for (NSString *keyValuePair in urlComponents) {

            NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="];

            NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding];

            NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding];



            if (key == nil || value == nil) {

                continue;

            }
            id existValue = [parameters valueForKey:key];

            if (existValue != nil) {

                if ([existValue isKindOfClass:[NSArray class]]) {

                    NSMutableArray *items = [NSMutableArray arrayWithArray:existValue];

                    [items addObject:value];

                    [parameters setValue:items forKey:key];

                } else {

                    [parameters setValue:@[existValue, value] forKey:key];

                }

            } else {

                [parameters setValue:value forKey:key];

            }

        }

    } else {
        NSArray *pairComponents = [parametersString componentsSeparatedByString:@"="];
        if (pairComponents.count == 1) {
            return nil;
        }
        NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding];
        NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding];
        if (key == nil || value == nil) {
            return nil;
        }
        [parameters setValue:value forKey:key];
    }
    return parameters;
}

Leave a Reply

Required fields are marked *