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