iOS开发攻城狮的集散地工欲善其事必先利其器Ios开发

三年经验之你忽略的小知识点

2018-04-19  本文已影响394人  SmallWhiteMouse

1、不自定义Cell,利用UITableView的几个属性 做出系统样式的编辑选中

pic-1.jpeg
    //1.允许在编辑模式中进行多选操作
    self.tableView.allowsSelectionDuringEditing = YES;

    //2.改变tableView的当前编辑状态
    [self.tableView setEditing:!self.tableView.isEditing animated:YES];

    //3.获取在编辑状态下被选中的cell
     NSArray<NSIndexPath *> *indexPaths = [self.tableView indexPathsForSelectedRows];
    

2、UITableView容易混淆模糊的属性(驼峰语法看起也头痛^ ~^ !!)

3、iOS图片拉伸技巧 代码及storyboard方式

原理: 配置保护哪部分内容,拉伸哪部分
//leftCapWidth代表左端盖宽度,topCapHeight代表顶端盖高度
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;  

//UIEdgeInsets类型的参数 内边距
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets  

PS:不知道拉伸区域为负数会如何,晚上实验一下

//UIEdgeInsets类型的参数 内边距
//UIImageResizingMode 通过拉伸UIEdgeInsets指定的矩形区域来填充图片
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode  
三种代码方式原理详细见解请看这位作者 iOS图片拉伸原理介绍

4、iOS图片缩小方法 (show code)

//img:为传入的图片;   size:为放置图片区域的大小;  scaledImage:为返回压缩后的图片
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{
    // 创建一个bitmap的context
    // 并把它设置成为当前正在使用的context
    UIGraphicsBeginImageContext(size);
    // 绘制改变大小的图片
    [img drawInRect:CGRectMake(0,0, size.width, size.height)];
    // 从当前context中创建一个改变大小后的图片
    UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();
    // 使当前的context出堆栈
    UIGraphicsEndImageContext();
    //返回新的改变大小后的图片
    return scaledImage;
}

5、KVC将字典赋值到模型中

    [obj setValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)];

6、修饰block为什么要用copy delegate要用weak

Block
Delegate

delegate 要用weak,主要是考虑到循环引用的问题。

7、id 与 instancetype 使用区别及举例理解 以及初始化方法为什么不用(ClassName *)返回示例对象

@interface Shop :NSObject
+(instancetype)shopWithName:(NSString *)name;   ------1 写法
+(id)shopWithName:(NSString *)name;             ------2 写法
@end
- (void)viewDidLoad{
     [super viewDidLoad];
    [[Shop shopWithName] setFrame:CGRectZero];
}

如果shopWithName1写法 ,编译器就会报错,是2写法 ,编译器就不会报错。

- (void)viewDidLoad{
     [super viewDidLoad];
    //子类可以使用父类非privated的属性和方法
     Dog *dog = [[Dog animalWithName];
}

+(Animal *)animalWithName:(NSString *)name返回的是一个Animal对象,你赋值给Dog类实例,系统就会在这儿提出警告说你类型不匹配。

8、KVC系统查找顺序

当调用setValue:属性值 forKey:@”name“的代码时:以@property name为例;

首先查找对象有没有setName,有则调用set方法赋值
没有找到set方法,就查找对象的成员变量有没有_name,有就_name = value
如果没有找到_name,还会去对象中查找name属性
最终没有找到则报错

9、宏及宏定义常见书写介绍

举例:

#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n",[[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif

10、模拟器 模拟内存警告

操作步骤:
一、实现测试内存警告接收方法

//appdelegate.m文件实现应用程序接收内存警告协议方法
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
    
    NSLog(@"%s",__func__);
}

二、模仿内存警告
操作:
1.Debug-》Simulate Memory Warning


samulator.png

11、自定义控制器View

做法:重写控制器的-loadView方法。

- (void)loadView{
    self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.view.backgroundColor = [UIColor redColor];
}

12、iOS系统自带方法渲染图片

    [[UIImage new] imageWithRenderingMode:UIImageRenderingMode];

13、@synchronized互斥锁简介

@synchronized(锁对象){
  //需要锁定的代码
}

假如在面试过程中,问到线程同步的东西,这个互斥锁就是使用了线程同步技术。线程同步的意思就是多条线程在同一条线上执行(按顺序执行任务)

14、挺全面的atomic nonatomic 注解

15、计算执行一段代码所消耗的时间

NSDate   *begin  = [NSDate date];
NSData  *data = [NSData dataWithContentsOfURL:url];
NSDate  *end = [NSDate date];
NSLog(@"%f",[end timeIntervalSinceDate:begin]);
CFTimeInterval begin = CFAbsoluteTimeGetCurrent();
NSData  *data = [NSData dataWithContentsOfURL:url];
CFTimeInterval   end = CFAbsoluteTimeGetCurrent();
NSLog(@"%f",end - begin);

16、分离路径字符串的最后一段元素lastPathComponent

    NSString  *urlPath = @"https://www.jianshu.com/u/8bacdb9ecf00";
    NSString *fileName = [urlPath lastPathComponent];
    NSLog(@"%@",fileName); //打印结果:8bacdb9ecf00

解释: (来源于苹果官方文档注释)

  • The last path component of the receiver.
  • Path components are alphanumeric strings delineated by the path separator (slash “/”) or the beginning or end of the path string. Multiple path separators at the end of the string are stripped.
  • Note that this method only works with file paths (not, for example, string representations of URLs).
Receiver’s String Value String Returned
/tmp/scratch.tiff scratch.tiff
/tmp/scratch scratch”
/tmp/ tmp
scratch/// scratch
/ /

17、持续更新中....

如果您有什么疑问或者书写歧义,非常感激您能留言~

上一篇下一篇

猜你喜欢

热点阅读