面试题

1.代码风格改错题

typedef enum { 

} UserSex;

一般不使用enum 改用NS_ENUM 或者 NS_OPTIONS 优点:宏定义方便,还可以指定继承与哪种类型。

typedef NS_ENUM(NSUInteger, JKUserSex) {
    JKUserSexMan,
    JKUserSexWoman
};
@interface JKUser( )

@property (nonatomic, strong) NSString *name; //一般定义为copy类型,不定义strong
@property (assign, nonatomic) int age; //格式要统一,int 改为NSUInteger ,int 分64、32 后者不分,长度一样
@property (nonatomic, assign) JKUserSex sex;
-(id) initUserModeWithUseName:(NSString) name withAge:(int)age; 

简单点写,返回值类型(实例化构造器),前面加一个空格

- (instancetype) initWithName:(NSString)name Age:(NSUInteger)age; 

添加一个工厂方法

+ (instancetype) userWithName:(NSString*)name Age:(NSUInteger)age;
-(void)doLogIn;

一个词直接写

- (void)login; @end
@implementation JKUser

+ (instancetype)initWithName:(NSString *)name age:(NSUInteger)age { 
    self = [super init]; 
    if (self) { 
        //避免调用getter方法,self.name 因为子类可能重写父类的getter方法 
        _name = [name copy]; _age = age; 
    } 
}

+ (instancetype) userWithName:(NSString*)name Age:(NSUInteger)age {
}

2.weak 关键字
(1)使用场景 weak 表示不持有对象,例如delegate,防止引用循环,双方释放不了
A->(引用)B B->(不持有)A
weak修饰的对象在销毁的时候自动置为nil, oc中向nil发送消息或者调用方法不会崩溃
(2)和assign的区别 assign主要用在基本数据类型上 NSInteger NSUInteger weak主要用在对象类型上 对象才有引用计数
(3)weak指向的对象销毁后, 向weak发消息会怎么样 不会调用,也不会崩溃
(4)weak对象是怎么存储的 (github中第八条) 像是键值对的表一样 通过weak对象和weak修饰的东西形成一个表
3.copy关键字
(1)使用场景 copy拷贝一个不可变的版本
(2)怎么实现copy关键字 实现NSCopying协议 协议方法copyWithZone
(3)下面的代码有什么问题

@property (nonatomic, copy) NSMutableArray *array; 

copy改为strong
(4)非集合类型 (NSString)的copy和集合类型(NSArray,NSDictionary)的copy
(5)深拷贝和浅拷贝 mutableCopy深拷贝对象,而且是可变的

4.@property 可以有哪些修饰符?
(1)原子性 nonatomic atomic 原子性在set方法里面加一个锁,保证原子操作,访问对象时候是同步的 别的线程是时刻不能访问的 重写atomic类型的setter方法要用@synchronized或者NSLock加一个锁
(2)读写修饰符 readwrite readonly
//readonly只会合成getter方法
//默认readwrite
(3)内存管理语义 strong weak retain unsafe_unretained assign copy
//strong和weak常用在ARC
//retain和unsafe_unretained常用在MRC
(4)指定存取方法 getter = setter = (BOOL类型、特殊名字的属性)
(5)@synthesize和@dynamic
//synthesize 指定属性变量名 firstName = myFirstName
//@dynamic firstName 这个属性则不会生成getter setter方法

5.向nil对象发送消息会出现什么?
不会崩溃,相当于没调用,runtime实现时候检查是否有值,nil则直接返回,有值继续进行。

6.runtime消息转发机制三步走
(1)MethodResolution 方法的实现

+(BOOL) resolveInstanceMethod:(SEL)sel {
    //根据sel添加方法实现,添加头文件 
    class_addMethod return YES;//NO时候进入第二步
}

+(BOOL) resolveClassMethod:(SEL)sel {
} 

(2)FastForwarding 快速转发到其他类(因为不用生成方法签名),他们也不干,进入(3)

- (id)forwardingTargetForSelector:(SEL)aSelector {
    return [NSObject new];//则进行这个类型的消息转发
    return nil; //进入第三步
}

(3)NormalForwarding 需要你提供方法签名,若仍不实现

- (NSMethodSignature*) methodSignatureForSelector:(SEL)aSelector {
    //一个方法的返回值和传入参数即为方法的签名
    return nil;//进入到最后
} 

有了签名调用以下触发消息

- (void)forwardInvocation:(NSInvocation*)anInvoction {
} 

程序就回进入最后调用 ->doseNotRecoginzeSelector方法

-(void)doesNotRecongnizeSelector:(SEL)aSelector {
    //报出异常
}

7.TableView的dataSource、delegate

8.ViewController生命周期方法的回调顺序
(1)viewDidLoad->viewWillAppear->viewWillLayoutSubviews->viewDidLayoutSubviews(布局子view)->viewDidAppear->viewWillDisappear->viewWillDisappear
(2)旋转时候调用 viewWillTransitionToSize:withTransitionCoordinator

9.界面分析、搭建(Autolayout、 code) 节省代码,所见即所得 绝对坐标适配

10.iOS中的设计模式
(单例模式、委托模式、工厂模式、观察者模式、中介者模式)
单例UIApplication.shared
委托delegate 通过工厂来构造不同的对象 NSString stringWith
工厂方法的工厂模式 抽象工厂
观察者NSNotificationCenter KVO
中介者NavicationController 通过此来导航协调各个controller

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值