iOS技巧總結(jié)

1、禁止手機(jī)睡眠

[UIApplication sharedApplication].idleTimerDisabled = YES;

2、 隱藏某行cell

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 如果是你需要隱藏的那一行婉刀,返回高度為0
    if(indexPath.row == YouWantToHideRow)
        return 0; 
    return 44;
}

// 然后再你需要隱藏cell的時(shí)候調(diào)用

[self.tableView beginUpdates];
[self.tableView endUpdates];

3、 禁用button高亮

button.adjustsImageWhenHighlighted = NO;
或者在創(chuàng)建的時(shí)
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

4唉窃、tableview遇到這種報(bào)錯(cuò) failed to obtain a cell from its dataSource

是因?yàn)槟愕腸ell被調(diào)用的早了窟蓝。先循環(huán)使用了cell,后又創(chuàng)建cell篮绿。順序錯(cuò)了
可能原因: 1.xib的cell沒有注冊(cè) 2.內(nèi)存中已經(jīng)有這個(gè)cell的緩存了(也就是說通過你的cellId找到的cell并不是你想要的類型)酌呆,這時(shí)候需要改下cell的標(biāo)識(shí)

5、cocoa pods報(bào)這個(gè)錯(cuò)誤:unable to access 'https://github.com/facebook/pop.git/': Operation timed out after 0 milliseconds with 0 out of 0 bytes received

解決辦法:原因可能是網(wǎng)絡(luò)問題搔耕,網(wǎng)絡(luò)請(qǐng)求超時(shí)了隙袁,只需要重試就行了

6、cocoa pods 出現(xiàn)ERROR: While executing gem ... (Errno::EPERM)

解決辦法:
https://segmentfault.com/q/1010000002926243

7弃榨、動(dòng)畫切換window的根控制器

// options是動(dòng)畫選項(xiàng)
[UIView transitionWithView:[UIApplication sharedApplication].keyWindow duration:0.5f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        BOOL oldState = [UIView areAnimationsEnabled];
        [UIView setAnimationsEnabled:NO];
        [UIApplication sharedApplication].keyWindow.rootViewController = [RootViewController new];
        [UIView setAnimationsEnabled:oldState];
    } completion:^(BOOL finished) {

    }];

8菩收、去除數(shù)組中重復(fù)的對(duì)象

NSArray *newArr = [oldArr valueForKeyPath:@“@distinctUnionOfObjects.self"];

9、編譯的時(shí)候遇到 no such file or directory: /users/apple/XXX

是因?yàn)榫幾g的時(shí)候鲸睛,在此路徑下找不到這個(gè)文件娜饵,解決這個(gè)問題,首先是是要檢查缺少的文件是不是在工程中官辈,如果不在工程中箱舞,需要從本地拖進(jìn)去,如果發(fā)現(xiàn)已經(jīng)存在工程中了拳亿,或者拖進(jìn)去還是報(bào)錯(cuò)晴股,這時(shí)候需要去build phases中搜索這個(gè)文件,這時(shí)候很可能會(huì)搜出現(xiàn)兩個(gè)相同的文件肺魁,這時(shí)候电湘,有一個(gè)路徑是正確的,刪除另外一個(gè)即可。如果刪除了還是不行寂呛,需要把兩個(gè)都刪掉怎诫,然后重新往工程里拖進(jìn)這個(gè)文件即可

build phases

10、iOS8系統(tǒng)中贷痪,tableView最好實(shí)現(xiàn)下-tableView: heightForRowAtIndexPath:這個(gè)代理方法幻妓,要不然在iOS8中可能就會(huì)出現(xiàn)顯示不全或者無法響應(yīng)事件的問題

11、iOS8中實(shí)現(xiàn)側(cè)滑功能的時(shí)候這個(gè)方法必須實(shí)現(xiàn)劫拢,要不然在iOS8中無法側(cè)滑

// 必須寫的方法涌哲,和editActionsForRowAtIndexPath配對(duì)使用,里面什么不寫也行
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}

12尚镰、三個(gè)通知

NSSystemTimeZoneDidChangeNotification監(jiān)聽修改時(shí)間界面的兩個(gè)按鈕狀態(tài)變化
UIApplicationSignificantTimeChangeNotification 監(jiān)聽用戶改變時(shí)間 (只要點(diǎn)擊自動(dòng)設(shè)置按鈕就會(huì)調(diào)用) 
NSSystemClockDidChangeNotification 監(jiān)聽用戶修改時(shí)間(時(shí)間不同才會(huì)調(diào)用)

13阀圾、SDWebImage本地緩存有時(shí)候會(huì)害人。如果之前緩存過一張圖片狗唉,即使下次服務(wù)器換了這張圖片初烘,但是圖片url沒換,用sdwebimage下載下來的還是以前那張,所以遇到這種問題分俯,不要先去懟服務(wù)器肾筐,清空下緩存再試就好了。

14缸剪、上線前注意:

1)吗铐、刪掉代碼中所有的測(cè)試代碼
2)、如果后臺(tái)有審核模式杏节,提醒后臺(tái)開啟此模式
3)唬渗、主流程再跑一跑
4)、全局搜索waring奋渔,檢查所有標(biāo)記waring的地方

15镊逝、跳進(jìn)app權(quán)限設(shè)置

// 跳進(jìn)app設(shè)置
 if (UIApplicationOpenSettingsURLString != NULL) {
      NSURL *url = [NSURL   
      URLWithString:UIApplicationOpenSettingsURLString];
   [[UIApplication sharedApplication] openURL:url];
  }

16、給一個(gè)view截圖

UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

17嫉鲸、開發(fā)中如果要?jiǎng)討B(tài)修改tableView的tableHeaderView或者tableFooterView的高度撑蒜,需要給tableView重新設(shè)置,而不是直接更改高度玄渗。正確的做法是重新設(shè)置一下tableView.tableFooterView = 更改過高度的view座菠。為什么?其實(shí)在iOS8以上直接改高度是沒有問題的藤树,在iOS8中出現(xiàn)了contentSize不準(zhǔn)確的問題浴滴,這是解決辦法。

18也榄、注意對(duì)象為nil的時(shí)候巡莹,調(diào)用此對(duì)象分類的方法不會(huì)執(zhí)行

19、collectionView的內(nèi)容小于其寬高的時(shí)候是不能滾動(dòng)的甜紫,設(shè)置可以滾動(dòng):

collectionView.alwaysBounceHorizontal = YES;
collectionView.alwaysBounceVertical = YES;

20降宅、設(shè)置navigationBar上的title顏色和大小

    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor youColor], NSFontAttributeName : [UIFont systemFontOfSize:15]}]

21、顏色轉(zhuǎn)圖片

+ (UIImage *)cl_imageWithColor:(UIColor *)color {
  CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  UIGraphicsBeginImageContext(rect.size);
  CGContextRef context = UIGraphicsGetCurrentContext();

  CGContextSetFillColorWithColor(context, [color CGColor]);
  CGContextFillRect(context, rect);

  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return image;
}

22囚霸、view設(shè)置圓角

#define ViewBorderRadius(View, Radius, Width, Color)\
\
[View.layer setCornerRadius:(Radius)];\
[View.layer setMasksToBounds:YES];\
[View.layer setBorderWidth:(Width)];\
[View.layer setBorderColor:[Color CGColor]] // view圓角

23腰根、強(qiáng)/弱引用

#define WeakSelf(type)  __weak typeof(type) weak##type = type; // weak
#define StrongSelf(type)  __strong typeof(type) type = weak##type; // strong

24、由角度轉(zhuǎn)換弧度
#define DegreesToRadian(x) (M_PI * (x) / 180.0)

25拓型、由弧度轉(zhuǎn)換角度
define RadianToDegrees(radian) (radian*180.0)/(M_PI)

26额嘿、獲取圖片資源
#define GetImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@",imageName]]

27、獲取temp
#define PathTemp NSTemporaryDirectory()

28劣挫、獲取沙盒 Document
#define PathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]

29册养、獲取沙盒 Cache

#define PathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]

30、GCD代碼只執(zhí)行一次

#define kDISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);

31压固、自定義NSLog

#ifdef DEBUG
#define NSLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define NSLog(...)
#endif

32球拦、Font

#define FontL(s)             [UIFont systemFontOfSize:s weight:UIFontWeightLight]
#define FontR(s)             [UIFont systemFontOfSize:s weight:UIFontWeightRegular]
#define FontB(s)             [UIFont systemFontOfSize:s weight:UIFontWeightBold]
#define FontT(s)             [UIFont systemFontOfSize:s weight:UIFontWeightThin]
#define Font(s)              FontL(s)

33、FORMAT

#define FORMAT(f, ...) [NSString stringWithFormat:f, ## __VA_ARGS__]

34帐我、在主線程上運(yùn)行
#define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);

35坎炼、開啟異步線程

#define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), globalQueueBlocl);

36、通知

#define NOTIF_ADD(n, f)     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(f) name:n object:nil]
#define NOTIF_POST(n, o)    [[NSNotificationCenter defaultCenter] postNotificationName:n object:o]
#define NOTIF_REMV()        [[NSNotificationCenter defaultCenter] removeObserver:self]

37拦键、隨機(jī)顏色

+ (UIColor *)RandomColor {
    NSInteger aRedValue = arc4random() % 255;
    NSInteger aGreenValue = arc4random() % 255;
    NSInteger aBlueValue = arc4random() % 255;
    UIColor *randColor = [UIColor colorWithRed:aRedValue / 255.0f green:aGreenValue / 255.0f blue:aBlueValue / 255.0f alpha:1.0f];
    return randColor;
}

38谣光、獲取window

+(UIWindow*)getWindow {
    UIWindow* win = nil; //[UIApplication sharedApplication].keyWindow;
    for (id item in [UIApplication sharedApplication].windows) {
        if ([item class] == [UIWindow class]) {
            if (!((UIWindow*)item).hidden) {
                win = item;
                break;
            }
        }
    }
    return win;
}

39、修改textField的placeholder的字體顏色芬为、大小

[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
[textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];

40萄金、統(tǒng)一收起鍵盤

[[[UIApplication sharedApplication] keyWindow] endEditing:YES];

41、控制屏幕旋轉(zhuǎn)媚朦,在控制器中寫

/** 是否支持自動(dòng)轉(zhuǎn)屏 */
- (BOOL)shouldAutorotate {
    return YES;
}

/** 支持哪些屏幕方向 */
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

/** 默認(rèn)的屏幕方向(當(dāng)前ViewController必須是通過模態(tài)出來的UIViewController(模態(tài)帶導(dǎo)航的無效)方式展現(xiàn)出來的捡絮,才會(huì)調(diào)用這個(gè)方法) */
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

42、獲取app緩存大小

- (CGFloat)getCachSize {

    NSUInteger imageCacheSize = [[SDImageCache sharedImageCache] getSize];
    //獲取自定義緩存大小
    //用枚舉器遍歷 一個(gè)文件夾的內(nèi)容
    //1.獲取 文件夾枚舉器
    NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
    NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:myCachePath];
    __block NSUInteger count = 0;
    //2.遍歷
    for (NSString *fileName in enumerator) {
        NSString *path = [myCachePath stringByAppendingPathComponent:fileName];
        NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
        count += fileDict.fileSize;//自定義所有緩存大小
    }
    // 得到是字節(jié)  轉(zhuǎn)化為M
    CGFloat totalSize = ((CGFloat)imageCacheSize+count)/1024/1024;
    return totalSize;
}

43莲镣、清理app緩存

- (void)handleClearView {
    //刪除兩部分
    //1.刪除 sd 圖片緩存
    //先清除內(nèi)存中的圖片緩存
    [[SDImageCache sharedImageCache] clearMemory];
    //清除磁盤的緩存
    [[SDImageCache sharedImageCache] clearDisk];
    //2.刪除自己緩存
    NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
    [[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];
}

44福稳、模型轉(zhuǎn)字典

static NSSet *classes;

- (NSMutableDictionary *)getParameterDictionary {

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    Class c = self.class;

    while (c) {
        unsigned count;
        objc_property_t *properties = class_copyPropertyList([c class], &count);

        for (int i = 0; i < count; i++) {
            NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
            dict[key] = [self valueForKey:key];
        }
        free(properties);

        // 獲得父類
        c = class_getSuperclass(c);

        if ([self isClassFromFoundation:c]) break;
    }
    return dict;
}

- (BOOL)isClassFromFoundation:(Class)c
{
    if (c == [NSObject class] || c == [NSManagedObject class]) return YES;

    __block BOOL result = NO;
    [[self foundationClasses] enumerateObjectsUsingBlock:^(Class foundationClass, BOOL *stop) {
        if ([c isSubclassOfClass:foundationClass]) {
            result = YES;
            *stop = YES;
        }
    }];
    return result;
}

- (NSSet *)foundationClasses
{
    if (classes == nil) {
        // 集合中沒有NSObject,因?yàn)閹缀跛械念惗际抢^承自NSObject瑞侮,具體是不是NSObject需要特殊判斷
        classes = [NSSet setWithObjects:
                              [NSURL class],
                              [NSDate class],
                              [NSValue class],
                              [NSData class],
                              [NSError class],
                              [NSArray class],
                              [NSDictionary class],
                              [NSString class],
                              [NSAttributedString class], nil];
    }
    return classes;
}

45的圆、交換兩個(gè)方法實(shí)現(xiàn)

Class aClass = [self class]; 

        SEL originalSelector = @selector(viewWillAppear:); 
        SEL swizzledSelector = @selector(xxx_viewWillAppear:); 

        Method originalMethod = class_getInstanceMethod(aClass, originalSelector); 
        Method swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector); 

        BOOL didAddMethod = 
            class_addMethod(aClass, 
                originalSelector, 
                method_getImplementation(swizzledMethod), 
                method_getTypeEncoding(swizzledMethod)); 

        if (didAddMethod) { 
            class_replaceMethod(aClass, 
                swizzledSelector, 
                method_getImplementation(originalMethod), 
                method_getTypeEncoding(originalMethod)); 
        } else { 
            method_exchangeImplementations(originalMethod, swizzledMethod); 
        }

46、打印百分號(hào)和引號(hào)

    NSLog(@"%%");
    NSLog(@"\"");

47半火、幾個(gè)常用權(quán)限判斷

if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {
    NSLog(@"沒有定位權(quán)限");
}
AVAuthorizationStatus statusVideo = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (statusVideo == AVAuthorizationStatusDenied) {
    NSLog(@"沒有攝像頭權(quán)限");
}
//是否有麥克風(fēng)權(quán)限
AVAuthorizationStatus statusAudio = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
if (statusAudio == AVAuthorizationStatusDenied) {
    NSLog(@"沒有錄音權(quán)限");
}
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    if (status == PHAuthorizationStatusDenied) {
        NSLog(@"沒有相冊(cè)權(quán)限");
    }
}];

48越妈、獲取手機(jī)型號(hào)

+ (NSString *)getDeviceInfo {
struct utsname systemInfo;
uname(&systemInfo);
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c";
if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c";
if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s";
if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s";
if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
// 日行兩款手機(jī)型號(hào)均為日本獨(dú)占,可能使用索尼FeliCa支付方案而不是蘋果支付
if ([platform isEqualToString:@"iPhone9,1"])    return @"國行钮糖、日版梅掠、港行iPhone 7";
if ([platform isEqualToString:@"iPhone9,2"])    return @"港行酌住、國行iPhone 7 Plus";
if ([platform isEqualToString:@"iPhone9,3"])    return @"美版、臺(tái)版iPhone 7";
if ([platform isEqualToString:@"iPhone9,4"])    return @"美版阎抒、臺(tái)版iPhone 7 Plus";
if ([platform isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G";
if ([platform isEqualToString:@"iPad1,1"]) return @"iPad 1G";
if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2";
if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2";
if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2";
if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2";
if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini 1G";
if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini 1G";
if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini 1G";
if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3";
if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3";
if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3";
if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4";
if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4";
if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4";
if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air";
if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air";
if ([platform isEqualToString:@"iPad4,3"]) return @"iPad Air";
if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini 2G";
if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini 2G";
if ([platform isEqualToString:@"iPad4,6"]) return @"iPad Mini 2G";
if ([platform isEqualToString:@"i386"]) return @"iPhone Simulator";
if ([platform isEqualToString:@"x86_64"]) return @"iPhone Simulator";
return platform;

}

49酪我、長按復(fù)制功能

- (void)viewDidLoad
{
    [self.view addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pasteBoard:)]];
}
- (void)pasteBoard:(UILongPressGestureRecognizer *)longPress {
    if (longPress.state == UIGestureRecognizerStateBegan) {
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        pasteboard.string = @"需要復(fù)制的文本";
    }
}

50、cocoapods升級(jí)

在終端執(zhí)行 sudo gem install -n / usr / local / bin cocoapods --pre

51且叁、設(shè)置啟動(dòng)頁后都哭,依然顯示之前的

刪除app,手機(jī)重啟逞带,重新安裝

52欺矫、判斷圖片類型

//通過圖片Data數(shù)據(jù)第一個(gè)字節(jié) 來獲取圖片擴(kuò)展名
- (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;
}

53、獲取手機(jī)和app信息

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  
 CFShow(infoDictionary);  
// app名稱  
 NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];  
 // app版本  
 NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];  
 // app build版本  
 NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];  
  //手機(jī)序列號(hào)  
    NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];  
    NSLog(@"手機(jī)序列號(hào): %@",identifierNumber);  
    //手機(jī)別名: 用戶定義的名稱  
    NSString* userPhoneName = [[UIDevice currentDevice] name];  
    NSLog(@"手機(jī)別名: %@", userPhoneName);  
    //設(shè)備名稱  
    NSString* deviceName = [[UIDevice currentDevice] systemName];  
    NSLog(@"設(shè)備名稱: %@",deviceName );  
    //手機(jī)系統(tǒng)版本  
    NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];  
    NSLog(@"手機(jī)系統(tǒng)版本: %@", phoneVersion);  
    //手機(jī)型號(hào)  
    NSString* phoneModel = [[UIDevice currentDevice] model];  
    NSLog(@"手機(jī)型號(hào): %@",phoneModel );  
    //地方型號(hào)  (國際化區(qū)域名稱)  
    NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];  
    NSLog(@"國際化區(qū)域名稱: %@",localPhoneModel );  

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  
    // 當(dāng)前應(yīng)用名稱  
    NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"];  
    NSLog(@"當(dāng)前應(yīng)用名稱:%@",appCurName);  
    // 當(dāng)前應(yīng)用軟件版本  比如:1.0.1  
    NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];  
    NSLog(@"當(dāng)前應(yīng)用軟件版本:%@",appCurVersion);  
    // 當(dāng)前應(yīng)用版本號(hào)碼   int類型  
    NSString *appCurVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"];  
    NSLog(@"當(dāng)前應(yīng)用版本號(hào)碼:%@",appCurVersionNum);

54展氓、獲取一個(gè)類的所有屬性

id LenderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}

55穆趴、image圓角

- (UIImage *)circleImage
{
    // NO代表透明
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 1);
    // 獲得上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 添加一個(gè)圓
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    // 方形變圓形
    CGContextAddEllipseInRect(ctx, rect);
    // 裁剪
    CGContextClip(ctx);
    // 將圖片畫上去
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

56、image拉伸

+ (UIImage *)resizableImage:(NSString *)imageName
{
    UIImage *image = [UIImage imageNamed:imageName];
    CGFloat imageW = image.size.width;
    CGFloat imageH = image.size.height;
    return [image resizableImageWithCapInsets:UIEdgeInsetsMake(imageH * 0.5, imageW * 0.5, imageH * 0.5, imageW * 0.5) resizingMode:UIImageResizingModeStretch];
}

57遇汞、JSON字符串轉(zhuǎn)字典

+ (NSDictionary *)parseJSONStringToNSDictionary:(NSString *)JSONString {
    NSData *JSONData = [JSONString dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableLeaves error:nil];
    return responseJSON;
}

58毡代、身份證號(hào)驗(yàn)證

- (BOOL)validateIdentityCard {
    BOOL flag;
    if (self.length <= 0) {
        flag = NO;
        return flag;
    }
    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
    return [identityCardPredicate evaluateWithObject:self];
}

59、獲取設(shè)備mac地址

+ (NSString *)macAddress {
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;

    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;

    if((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }

    if(sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }

    if((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. Rrror!\n");
        return NULL;
    }

    if(sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        return NULL;
    }

    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);

    return outstring;
}

60勺疼、導(dǎo)入自定義字體庫

1教寂、找到你想用的字體的 ttf 格式,拖入工程
2执庐、在工程的plist中增加一行數(shù)組酪耕,“Fonts provided by application”
3、為這個(gè)key添加一個(gè)item轨淌,value為你剛才導(dǎo)入的ttf文件名
4迂烁、直接使用即可:label.font = [UIFont fontWithName:@"你剛才導(dǎo)入的ttf文件名" size:20.0];

61递鹉、拿到當(dāng)前正在顯示的控制器盟步,不管是push進(jìn)去的,還是present進(jìn)去的都能拿到

- (UIViewController *)getVisibleViewControllerFrom:(UIViewController*)vc {
    if ([vc isKindOfClass:[UINavigationController class]]) {
        return [self getVisibleViewControllerFrom:[((UINavigationController*) vc) visibleViewController]];
    }else if ([vc isKindOfClass:[UITabBarController class]]){
        return [self getVisibleViewControllerFrom:[((UITabBarController*) vc) selectedViewController]];
    } else {
        if (vc.presentedViewController) {
            return [self getVisibleViewControllerFrom:vc.presentedViewController];
        } else {
            return vc;
        }
    }
}

62躏结、runtime為一個(gè)類動(dòng)態(tài)添加屬性

// 動(dòng)態(tài)添加屬性的本質(zhì)是: 讓對(duì)象的某個(gè)屬性與值產(chǎn)生關(guān)聯(lián)
        objc_setAssociatedObject(self, WZBPlaceholderViewKey, placeholderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

63却盘、獲取runtime為一個(gè)類動(dòng)態(tài)添加的屬性

objc_getAssociatedObject(self, WZBPlaceholderViewKey);

64、KVO監(jiān)聽某個(gè)對(duì)象的屬性

// 添加監(jiān)聽者
[self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:nil];

// 當(dāng)監(jiān)聽的屬性值變化的時(shí)候會(huì)來到這個(gè)方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"property"]) {
       [self textViewTextChange];
       } else {
     }
}

65媳拴、Reachability判斷網(wǎng)絡(luò)狀態(tài)

NetworkStatus status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
    if (status == NotReachable) {
        NSLog(@"當(dāng)前設(shè)備無網(wǎng)絡(luò)");
    }
    if (status == ReachableViaWiFi) {
        NSLog(@"當(dāng)前wifi網(wǎng)絡(luò)");
    }
    if (status == NotReachable) {
        NSLog(@"當(dāng)前蜂窩移動(dòng)網(wǎng)絡(luò)");
    }

注:個(gè)人筆記用黄橘,原作者@雜霧無塵 原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屈溉,隨后出現(xiàn)的幾起案子塞关,更是在濱河造成了極大的恐慌,老刑警劉巖子巾,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帆赢,死亡現(xiàn)場(chǎng)離奇詭異小压,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椰于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門怠益,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廉羔,你說我怎么就攤上這事溉痢∑г欤” “怎么了憋他?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長髓削。 經(jīng)常有香客問我竹挡,道長,這世上最難降的妖魔是什么立膛? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任揪罕,我火速辦了婚禮,結(jié)果婚禮上宝泵,老公的妹妹穿的比我還像新娘好啰。我一直安慰自己,他們只是感情好儿奶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布框往。 她就那樣靜靜地躺著,像睡著了一般闯捎。 火紅的嫁衣襯著肌膚如雪椰弊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天瓤鼻,我揣著相機(jī)與錄音秉版,去河邊找鬼。 笑死茬祷,一個(gè)胖子當(dāng)著我的面吹牛清焕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祭犯,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耐朴,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了盹憎?” 一聲冷哼從身側(cè)響起筛峭,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陪每,沒想到半個(gè)月后影晓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镰吵,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年挂签,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疤祭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饵婆,死狀恐怖勺馆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侨核,我是刑警寧澤草穆,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站搓译,受9級(jí)特大地震影響悲柱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜些己,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一豌鸡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧段标,春花似錦涯冠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至往堡,卻和暖如春械荷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虑灰。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工吨瞎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穆咐。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓颤诀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親对湃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崖叫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1、禁止手機(jī)睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,117評(píng)論 1 6
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評(píng)論 30 470
  • 國慶期間拍柒,一直重感冒心傀,門都沒咋出,畫也不想畫拆讯,昏昏沉沉脂男,好在养叛,放假前已經(jīng)畫完這張虞美人。 虞美人是一種很獨(dú)特的花宰翅,...
    一夏飄雪閱讀 5,623評(píng)論 3 92
  • 產(chǎn)品從0到1到底該怎么做弃甥?該做些什么,這個(gè)其實(shí)很多人都在討論汁讼,個(gè)人曾經(jīng)完整的經(jīng)歷過一個(gè)從0到1的產(chǎn)品迭代淆攻,在這方...
    蝸牛道長168閱讀 745評(píng)論 0 4