iOS 基础内容

banner

序言

基础要牢固!


OC的理解与特性
简述内存管理基本原则
其他注意事项
如何理解MVC设计模式

MVC是一种架构模式,M表示Model,V表示视图View,C表示控制器Controller:

如何理解MVVM设计模式。
Objective-C 中是否支持垃圾回收机制?
协议的基本概念和协议中方法默认为什么类型。
简述类目category优点和缺点。

优点

缺点

类别的作用
循环引用的产生原因,以及解决方法。
键路径(keyPath)、键值编码(KVC)和键值观察(KVO)

键路径

键值编码KVC

键值观察KVO

Demo

    [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; 
    #pragma mark KVO 
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    { 
         if ([keyPath isEqualToString:@"highlighted"] ) { 
          [self setNeedsDisplay]; 
        } 
     }

对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

KVC机制通过key找到value的原理。
在 Objective-C 中如何实现 KVO
代理的作用
NSNotification、Block、Delegate和KVO的区别
Objective-C中可修改和不可以修改类型
当我们调用一个静态方法时,需要对对象进行 release 吗?
当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢?
对谓词的认识
static、self、super关键字的作用
#include与#import的区别,#import 与@class 的区别
@public、@protected、@private 它们的含义与作用
解释 id 类型
switch 语句 if 语句区别与联系
isMemberOfClass 和 isKindOfClass 联系与区别
OS 开发中数据持久性有哪几种?

数据存储的核心都是写文件。

CoreData的介绍:
CoreData的特征:

Core Data的6成员对象

Core Data的功能
对象可以被copy的条件
自动释放池工作原理
在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?
解释self = [super init]方法
定义属性时,什么时候用 assign、retain、copy 以及它们的之间的区别。
堆和栈的区别
怎样使用performSelector传入3个以上参数,其中一个为结构体。

因为系统提供的performSelector的API中,并没有提供三个参数。因此,我们只能传数组或者字典,但是数组或者字典只有存入对象类型,而结构体并不是对象类型,我们只能通过对象放入结构作为属性来传过去了.

    - (id)performSelector:(SEL)aSelector;
    - (id)performSelector:(SEL)aSelector withObject:(id)object;
    - (id)performSelector:(SEL)aSelector withObject:
       (id)object1 withObject:(id)object2;

具体实现如下:

    typedef struct HYBStruct {
    int a;
    int b;
    } *my_struct;

    @interface HYBObject : NSObject

    @property (nonatomic, assign) my_struct arg3;
    @property (nonatomic, copy)  NSString *arg1;
    @property (nonatomic, copy) NSString *arg2;

    @end
    @implementation HYBObject
    。
    // 在堆上分配的内存,我们要手动释放掉
    - (void)dealloc {
    free(self.arg3);
    }

    @end

测试:

    my_struct str = (my_struct)(malloc(sizeof(my_struct)));
    str->a = 1;
    str->b = 2;
    HYBObject *obj = [[HYBObject alloc] init];
    obj.arg1 = @"arg1";
    obj.arg2 = @"arg2";
    obj.arg3 = str; 
    [self performSelector:@selector(call:) withObject:obj]; 
    // 在回调时得到正确的数据的
    - (void)call:(HYBObject *)obj {
     NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
    }
UITableViewCell上有个UILabel,显示NSTimer实现的秒表时间,手指滚动cell过程中,label是否刷新,为什么?

这是否刷新取决于timer加入到Run Loop中的Mode是什么。Mode主要是用来指定事件在运行循环中的优先级的,分为:

·  NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
·  UITrackingRunLoopMode:ScrollView滑动时会切换到该Mode
·  UIInitializationRunLoopMode:run loop启动时,会切换到该mode
·  NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合

苹果公开提供的Mode有两个

·  NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
·  NSRunLoopCommonModes(kCFRunLoopCommonModes)

在编程中:如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果希望在滚动时,定时器也要回调,那就应该使用common mode。

对于单元格重用的理解
解决cell重用的问题
有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现?
使用block有什么好处?使用NSTimer写出一个使用block显示(在UILabel上)秒表的代码。
一个view已经初始化完毕,view上面添加了n个button,除用view的tag之外,还可以采用什么办法来找到自己想要的button来修改button的值。
线程与进程的区别和联系?
多线程编程

多线程编程是防止主线程堵塞、增加运行效率的最佳方法。

定时器与线程的区别
TCP和UDP的区别于联系
TCP连接的三次握手
Scoket连接和HTTP连接的区别
HTTP协议的特点,关于HTTP请求GET和POST的区别

GET和POST的区别

传输数据的大小:

安全性:

XML数据解析方式各有什么不同,JSON解析有哪些框架?
如何进行网络消息推送
网络七层协议
对NSUserDefaults的理解
SDWebImage原理

调用类别的方法:

OC中是否有二维数组,如何实现二维数组?
LayoutSubViews在什么时候被调用?
深拷贝和浅拷贝
单例模式理解与使用
对沙盒的理解

Preferences包含应用程序的偏好设置文件,不可在这更改偏好设置;temp存放临时文件即应用程序再次启动不需要的文件。

对瀑布流的理解
ViewController 的 loadView、viewDidLoad、viewDidUnload 分别是在什么时候调用的?
关键字volatile有什么含意?并给出三个不同的例子:
@synthesize、@dynamic的理解
frame和bounds有什么不同?
view的touch事件有哪些?
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
自定义实现UITabbarController的原理
iOS中的响应者链的工作原理
View和View之间传值方式
property属性的修饰符的作用
对于Run Loop的理解详情
SQLite中常用的SQL语句
XIB与Storyboards的优缺点

优点:

缺点:

将字符串“2015-04-10”格式化日期转为NSDate类型
NSString *timeStr = @"2016-03-10";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [formatter dateFromString:timeStr];
// 2016-03-09 16:00:00 +0000
NSLog(@"%@", date);
队列和多线程的使用原理

在iOS中队列分为以下几种:

更多细节见下图:

gcd

内存的使用和优化的注意事项
UIViewController的完整生命周期
-[ViewController initWithNibName:bundle:];
-[ViewController init];
-[ViewController loadView];
-[ViewController viewDidLoad];
-[ViewController viewWillDisappear:];
-[ViewController viewWillAppear:];
-[ViewController viewDidAppear:];
-[ViewController viewDidDisappear:];
UIImageView添加圆角

最直接的方法就是使用如下属性设置:

//**这是离屏渲染(off-screen-rendering),消耗性能的**
imgView.layer.cornerRadius = 10;
// 这一行代码是很消耗性能的
imgView.clipsToBounds = YES;

给UIImage添加生成圆角图片的扩展API:这是on-screen-rendering

- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
CGRect rect = (CGRect){0.f, 0.f, self.size};

UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
CGContextAddPath(UIGraphicsGetCurrentContext(),
 [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());

[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return image;
}