iOS常用知识

一些有关iOS的常用知识,做个留存,方便后期查看使用。

1、判断是否是模拟器:

#if TARGET_IPHONE_SIMULATOR
    NSLog(@"模拟器");
#else
    NSLog(@"真机");
#endif

2、创建枚举:

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,
    UIControlStateDisabled     = 1 << 1,
};

3、定义字符串常量规范:(1)建议模仿苹果;(2)加上const 保证字符串不可更改;(3)应尽量保证可读性,不要怕句子太长。

.h中:

UIKIT_EXTERN NSString *const kUITableViewCellIdentifier; 

.m中:

NSString *const kUITableViewCellIdentifier = @"kUITableViewCellIdentifier";

4、如果声明的属性,只想使用的get方法,不使用set方法,并且不想让外界更改这个属性的值,那么建议在括号里面加readonly。示例:

@property(nonatomic,readonly,getter=isSelect) BOOL select;

5、setImageEdgeInsets和setTitleEdgeInsets设置button的图片和文字显示位置(默认是左图右字,上移和左移都是负,反之为正)。想两改变两个子控件的显示位置,可以分别通过setTitleEdgeInsets和setImageEdgeInsets来实现。

需要注意的是,对titleLabel和imageView设置偏移,是针对它当前的位置起作用的,并不是针对它距离button边框的距离的。
[button setImageEdgeInsets:UIEdgeInsetsMake(0, imageEdge, 0, -imageEdge)];
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, titleEdge, 0, -titleEdge)];

6、刷新Section:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];

7、Image转换NSString:

- (NSString *)GainImageStringFromImage:(UIImage *)image {
    NSData * data = UIImageJPEGRepresentation(image, 1.0f);
    NSString * encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];;
    return encodedImageStr;
}

NSString转换Image:

- (UIImage *)GainImageFromImageString:(NSString *)imageStr {
    NSData * data = [[NSData alloc] initWithBase64Encoding:imageStr];
    UIImage * image = [UIImage imageWithData:data];
    return image;
}

8、字典判断为空:

[dict isKindOfClass:[NSNull class]]

9、字典遍历:
说明当stop为yes时,就会停止遍历,所以我们可以在块中加入条件(即当某种条件下去停止遍历)。

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
    
}];

10、设置UITextField的placeholder:

UITextField *textField = [[UITextField alloc]init];
textField.placeholder = @"请输入";
textField.textColor = k_DefaultColor666666;
textField.textAlignment = NSTextAlignmentRight;
[textField setValue:k_DefaultColor999999 forKeyPath:@"_placeholderLabel.textColor"];
[textField setValue:[UIFont systemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
textField.font = [UIFont systemFontOfSize:15];

11、(1)typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

typedef void (^Block)(void);

(2)typeof 运算符返回一个用来表示表达式的数据类型的字符串。
可能的字符串有:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。

alert(typeof (123));//typeof(123)返回"number" 
alert(typeof ("123"));//typeof("123")返回"string"

12、UIStoryboard创建:

SecondViewController * second = [[UIStoryboard storyboardWithName:@"First" bundle:nil]instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self presentViewController:second animated:YES completion:nil];

XIB创建:

MainViewController * main = [[MainViewController alloc]initWithNibName:@"MainViewController" bundle:[NSBundle mainBundle]];
BaseView * base = [[[NSBundle mainBundle]loadNibNamed:@"BaseView" owner:self options:nil] firstObject];

13、模态试图:

page.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
page.modalPresentationStyle = UIModalPresentationOverCurrentContext;

14、newRect = [someView convertRect:rect toView:toView];
解释: rect是相对于someView的,以toView为坐标系重新计算rect的值
newRect = [someView convertRect:rect fromView:fromView];
解释: rect是以fromView为坐标系下的值,将rect转为以someView为坐标系的值
https://www.jianshu.com/p/dcefe7150bfe


15、比较两个xx是否一样:

//比较两个frame是否一样
CGRectEqualToRect(frame, CGRectZero)
//比较两个point是否一样
CGPointEqualToPoint(point, CGPointZero)
//比较两个size是否一样
CGSizeEqualToSize(size, CGSizeZero)

16、打印frame:

NSLog(@"%@",NSStringFromCGRect(self.frame));

文档中:

UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);
UIKIT_EXTERN NSString *NSStringFromCGVector(CGVector vector);
UIKIT_EXTERN NSString *NSStringFromCGSize(CGSize size);
UIKIT_EXTERN NSString *NSStringFromCGRect(CGRect rect);
UIKIT_EXTERN NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
UIKIT_EXTERN NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
UIKIT_EXTERN NSString *NSStringFromDirectionalEdgeInsets(NSDirectionalEdgeInsets insets) API_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));
UIKIT_EXTERN NSString *NSStringFromUIOffset(UIOffset offset);

17、快速打真机测试ipa包:
(1)、创建空文件夹Payload;
(2)、将项目中Products下的xxx.aap复制到文件夹中;
(3)、压缩文件夹,该后缀名zip为ipa,则可获取ipa包。
安装:pp助手-应用游戏-应用列表,直接将ipa拖到应用列表即可安装。


18、获取绝对值:

fabs(<#double#>)  // 得出double类型数的绝对值
fabsf(<#float#>) // 得出float类型数的绝对值
abs(<#int#>)  // 得出int类型数的绝对值

19、访问麦克风权限:

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
     if (granted) {
         NSLog(@"Authorized");
     }else{
         NSLog(@"Denied or Restricted");
     }
}];

20、设置没有弹簧反弹效果:

scrollView.bounces = NO;//设置没有弹簧反弹效果

21、UIScrollView内容向下偏移20问题处理,在控制器添加:

self.automaticallyAdjustsScrollViewInsets = NO;
if (@available(iOS 11.0, *)) {
    UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

22、获取项目中可使用字体:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"所有字体 == %@: %@", fontFamily, fontNames);
}

23、Xcode系统配置包路径:

快捷键:shift+command+G
路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

Xcode系统配置包 github下载

23、Xcode 证书配置文件路径

/Users/wxq/Library/MobileDevice/Provisioning Profiles

24、mac上需要开启允许任何来源,来运行第三方下载的软件。
解决方法:打开终端,然后输入以下命令:

sudo spctl --master-disable 

25、实现模糊效果:

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"found"]];
UIVisualEffectView * visualView = [[UIVisualEffectView alloc]init];
visualView.frame = self.view.bounds;
visualView.effect = nil;
[self.view addSubview:visualView];
[UIView animateWithDuration:3 delay:1 options:UIViewAnimationOptionRepeat animations:^{
    visualView.effect = [[UIVisualEffectView alloc]initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]].effect;
} completion:^(BOOL finished) {
        
}];

26、打印地址:%p

NSMutableString * tempMStr = [[NSMutableString alloc]initWithString:@"strValue"];
NSLog(@"tempMStr值地址:%p,tempMStr值%@,tempMStr值引用计数%@", tempMStr,tempMStr,[tempMStr valueForKey:@"retainCount"]);

打印方法名:

NSLog(@"--- %s ---",__func__);//__func__打印方法名

27、单例:

+ (instancetype) instance {
    static trHttpClient *_instance = nil;
    static dispatch_once_t trHttpClientPredicate;
    dispatch_once(&trHttpClientPredicate, ^{
        _instance = [[self alloc] initSingleton];
    });
    return _instance;
}

28、两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。
在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。

@property (nonatomic, copy, nonnull) NSArray * items;
@property (nonatomic, copy) NSArray * __nonnull items;

29、&和&&
&:不管前面的条件是否正确,后面都执行。
&&:前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好。


30、GitHub的README.md 图片:

![水波浪加载动画](https://github.com/wuyukobe24/WaveLoadAnimation/blob/master/水波浪.gif)

简书图片:

![图片名](http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0.jpg) 

文字链接:

[简书](http://jianshu.io)

网址链接:

<http://example.com/>

31、比较:

char   字符      字节2 位数16  数值范围:0 〜 2x10^6-1
int    整型      字节4 位数32  数值范围: -2147483648〜+2147483647  有效数位 10 
long   长整型    字节8 位数64   数值范围 -2^63〜2^63 - 1
float  单精度浮点 字节4 位数32   数值范围 -3.4×10^-38〜3.4×10^38    有效数位 6~7    小数点后一位
double 双精度浮点 字节8 位数64   数值范围 -1.7×10^-308〜1.7×10^308  有效数位 6~7    小数点后两位

32、iOS设备:

iPhone各机型尺寸:
机型          屏幕尺寸 屏幕宽高(像素)   屏幕宽高(点)  模式
iPhone 3GS   3.5    320 x 480       320 x 480    1x
iPhone 4S    3.5    640 x 960       320 x 480    2x
iPhone 5SE   4      640 x 1136      320 x 568    2x
iPhone 8     4.7    750 x 1334      375 x 667    2x
iPhone 8 P   5.5    1242 x 2208     414 x 736    3x
iPhone X     5.8    1125 × 2436     375 × 812    3x
iPad各机型尺寸:
1、9.7寸   (width = 1024, height = 768)
2、10.5寸  (width = 1024, height = 768)
3、11寸    (width = 1194, height = 834)
4、12.9寸  (width = 1366, height = 1024)

33、重写description方法:

#import <objc/message.h>

- (NSString *)description {
    unsigned int count;
    const char *clasName = object_getClassName(self);
    NSMutableString *string = [NSMutableString stringWithFormat:@"<%s: %p>:[ \n",clasName, self];
    Class clas = NSClassFromString([NSString stringWithCString:clasName encoding:NSUTF8StringEncoding]);
    Ivar *ivars = class_copyIvarList(clas, &count);
    for (int i = 0; i < count; i++) {
        @autoreleasepool {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            //得到类型
            NSString *type = [NSString stringWithCString:ivar_getTypeEncoding(ivar) encoding:NSUTF8StringEncoding];
            NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
            id value = [self valueForKey:key];
            //确保BOOL 值输出的是YES 或 NO,这里的B是我打印属性类型得到的……
            if ([type isEqualToString:@"B"]) {
                if ([[NSString stringWithFormat:@"%@",value] isEqualToString:@"0"]) {
                    value = @"NO";
                } else {
                    value = @"YES";
                }
            }
            [string appendFormat:@"\t%@ = %@\n",[self delLine:key], value];
        }
    }
    [string appendFormat:@"]"];
    return string;
}

//去掉下划线
- (NSString *)delLine:(NSString *)string {    
    if ([string hasPrefix:@"_"]) {
        return [string substringFromIndex:1];
    }
    return string;
}

34、Xcode创建bundle文件:

  • command + shift + n 创建新工程,顶部选择“macOS”,然后Framework&Library中选择“Bundle”,然后“Next”,填写项目名称 Produce Name,项目则创建成功;
  • info.plist中修改Bundle name 和Executable file 为创建的项目名称,Localization native development region 设置为“en”;
  • Build Setting中设置 Base SDK 为 “iOS”,底部COMBINE_HIDPI_IMAGES 为“NO”;
  • Command+B编译一下,在Products文件夹的.bundle文件下Show In Finder就可以找到制作好的bundle包了。将其添加到其他项目中就可以用了。

35、模拟器沙河路径:
/Users/wangxueqi/Library/Developer/CoreSimulator/Devices/76228768-64BD-417C-9473-458B295D81CB/data/Containers/Data/Application/C765EF9B-7C43-48C1-B457-4A8E44FC3DB6


36、废弃的方法:

- (void)play DEPRECATED_MSG_ATTRIBUTE("请使用addPeriodicTimeObserverWithUsingBlock");

37、 添加防止多次响应的防抖方法

[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonClick:) object:nil];
[self performSelector:@selector(buttonClick:) withObject:picUrl afterDelay:0 inModes:@[NSRunLoopCommonModes]];

38、[UIApplication sharedApplication].keyWindow和[[UIApplication sharedApplication].delegate window]区别:

答:在执行 didFinishLaunchingWithOptions: 这个代理方法时,在执行[self.window makeKeyAndVisible];方法之前,通过[UIApplication sharedApplication].keyWindow 方法获取不到window,且在执行[UIApplication sharedApplication].keyWindow之前是要执行,rootviewcontroller的代码的,因此先执行了controller中的代码,但是在controller中我们发现,在viewWillAppear和viewDidLoad 中的keywindow也是nil,但是在直到viewWillLayoutSubviews时才有了keywindow的值。但是无论何时都能获取到delegate.window。

结论:
1、在获取到window时最好使用[[UIApplication sharedApplication].delegate window]获取window
2、不要在keywindow为nil的时候给window上添加代码,例如添加弹窗。


39、Mac显示隐藏文件:
Mac显示隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES
Mac隐藏隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO
然后重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->重新启动


40、获取一个随机数范围在:[100,200],包括100,包括200:
int y =100 + (arc4random() % 101);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容