iOS 基础知识拾遗

  1. 设计模式相关:

设计模式是一种编码经验, 就是以比较成熟的逻辑去处理某一类型的事情. 架构模式: (1).MVC (2).MVVM (3)MVP (4)VIPER MV(X)系列详解 英文原文->

iOS中常用设计模式: (1). 单例模式: 通过static关键字及dispatch_once保证单列在程序运行期间只会被初始化一次. (2). KVO: 通过runtime动态生成一个新的类, 并重写被观察对象属性的setter方法, 来监听对象属性的改变 (3). 委托模式: protrcol + delegate (4).工厂模式: 通过一个类方法, 批量根据已有模板生产对象.

  1. #import#incloud的区别, @class作用?

#import#incloud都是用来导入头文件. #incloud是C/C++中用来导入头文件的关键字; #import是Objective-C中用来导入头文件的关键字, 通过预编译指令来防止文件多次导入; @class用来告诉编译器某个类的声明, 到运行时才去查看类的实现文件(.m), 可以解决头文件的相互包含.

  1. framebounds的区别?

frame是 自身在父view坐标系统中的位置和大小, bounds是自身在自己的坐标系统中的位置和大小

  1. Objective-C的类可以多重继承么?Category是什么? Category重写本类方法后,为什么本类方法不再执行, 是被替换了吗?

Objective-C的类是不可以多继承的. Category分类, 其中的方法会在运行时动态的添加到本类的method_list中, Category不能添加属性, 原因是无法在运行时本列的ivar_list大小已经确定, 无法动态的去添加_ivar, 可以通过动态绑定objc_associated来添加属性. 因为在运行时中, 本类的方法会先放入method_list中去, Category中添加的方法, 会进行memory_copy放入method_list中, 排在本类方法的前边, 如果和本类方法重名, 那么在调用的时候, 找到Category中添加的方法后就会返回调用. 所以并不是被替换,而是根本就没有调用到本类的方法去;

  1. @property的本质是什么?

@property本质就是_ivarsettergetter. 属性的本质就是一个带_的实例变量 + setter``getter存取方法. 一般们调用的时候尽量直接调用_ivar, 这样的好处是能够直接对实例变量进行赋值和读取,不用再经过存取方法

  1. @property有什么属性关键字?都有什么作用?

(1): 原子性关键字:atomic-- 默认. 原子性, 当属性被atomic修饰时,系统生成的settergetter方法中, 会进行加锁操作, 这样可以保证数据的完整性, 但并不能保证一定是线程安全的. 相较于nonatomic而言, 内存消耗更大. nonatomic-- 非默认. 非原子性, 更快, 若多个线程同时访问, 则结果无法预料.
(2)读写权限: readwrite-- 默认. 可读写, 系统会自动生成settergetter方法 readonly-- 非默认. 只可读, 系统只会生成getter方法, 不希望属性在类外改变
(3)内存管理语义: assign:-- 赋值特性, 进行简单的赋值操作 retain(MRC)/strong(ARC): -- 持有特性, setter方法会将传入的参数先保留, 再赋值. 传入参数的retainCount会+1 copy:-- 表示copy特性, setter方法会将传入参数复制一份, 常用于NSString, NSArray, NSDictionary等, 不论传入参数是否是可变对象, 自身持有的那一份保证不可变的属性. weak-- 表示一种非拥有关系, weak在属性所指的对象被销毁时, 属性的值会被自动清空 weak底层实现

  1. 系统对象的copymutableCopy和深拷贝、浅拷贝
  • 非集合类对象的copymutableCopy:
//!< 非集合类不可变对象:
    NSString *str = @"hello word";
    id copyStr = [str copy];
    id mutableCopyStr = [str mutableCopy];
    NSLog(@"str:%p class:%@  \n copyStr:%p class:%@ \n mutableCopyStr:%p  class:%@", str, [str class],  copyStr, [copyStr class], mutableCopyStr, [mutableCopyStr class]);
    
    //!< 非集合类可变对象:
    
    NSMutableString *str1 = [[NSMutableString alloc] initWithFormat:@"hello word"];
    id copyStr1 = [str1 copy];
    id mutableCopyStr1 = [str1 mutableCopy];
    NSLog(@"str1:%p class:%@  \n copyStr1:%p class:%@ \n mutableCopyStr1:%p  class:%@", str1, [str1 class],  copyStr1, [copyStr1 class], mutableCopyStr1, [mutableCopyStr1 class]);
  • 结果:
2019-04-23 16:57:57.185947+0800 JSOCInteraction[17107:6685981] str:0x102ef43b8 class:__NSCFConstantString  
 copyStr:0x102ef43b8 class:__NSCFConstantString 
 mutableCopyStr:0x6000001d2ac0  class:__NSCFString
2019-04-23 16:57:57.186221+0800 JSOCInteraction[17107:6685981] str1:0x6000001cbf00 class:__NSCFString  
 copyStr1:0x600000fc5660 class:__NSCFString 
 mutableCopyStr1:0x6000001cbdb0  class:__NSCFString

由上述代码可以看出, 对非集合类不可变对象进行copy浅拷贝, 只复制了对象的指针, 而mutableCopy深拷贝, 拷贝出了一份新的可变对象和一份指针; 对非集合类可变对象进行copymutableCopy都是深拷贝

  • 集合类对象的copymutableCopy:
NSArray *arr = @[];
    id copyArr = [arr copy];
    id mutableCArr = [arr mutableCopy];
    NSLog(@"arr:%p class:%@     \n  \tcopyArr:%p class:%@ \n \tmutableCArr:%p  class:%@", arr, [arr class],  copyArr, [copyArr class], mutableCArr, [mutableCArr class]);
    
    
    NSMutableArray *muArr = [NSMutableArray new];
    id copyMuArr = [muArr copy];
    id mutableCMuArr = [muArr mutableCopy];
    
    NSLog(@"muArr:%p class:%@     \n \tcopyMuArr:%p class:%@ \n \tmutableCMuArr:%p  class:%@", muArr, [muArr class],  copyMuArr, [copyMuArr class], mutableCMuArr, [mutableCMuArr class]);
  • 结果:
2019-04-23 16:57:57.186472+0800 JSOCInteraction[17107:6685981] arr:0x600000d88030 class:__NSArray0     
    copyArr:0x600000d88030 class:__NSArray0 
    mutableCArr:0x6000001cbf00  class:__NSArrayM
2019-04-23 16:57:57.187073+0800 JSOCInteraction[17107:6685981] muArr:0x6000001cbdb0 class:__NSArrayM     
    copyMuArr:0x600000d88030 class:__NSArray0 
    mutableCMuArr:0x6000001cbc00  class:__NSArrayM

由结果可见: 对不可变的集合类对象(NSArray, NSDictionary等)进行copy浅拷贝; 进行mutableCopy深拷贝; 不过只是单层深拷贝, 即只对对象本身进行深拷贝, 集合中的元素还是指针拷贝; 对可变集合类对象进行copymutableCopy都是进行了单层深拷贝.

  1. 如何让自己的类用 copy 修饰符?
@interface WKCopyObject ()<NSCopying, NSMutableCopying>

@property (nonatomic, copy) NSString *name;

@end
- (id)copyWithZone:(NSZone *)zone {
    WKCopyObject *obj = [[[self class] alloc] init];
    obj.name = self.name;
    return obj;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    WKCopyObject *obj = [[[self class] alloc] init];
    obj.name = self.name.mutableCopy;
    return obj;
}
  1. autoreleasepool的实现原理与释放时机?

我们使用clang指令对main.m进行rewrite, 得到main.cpp文件:clang -rewrite-objc main.m, 可以看到有关autoreleasepool的关键代码:

extern "C" __declspec(dllimport) void * objc_autoreleasePoolPush(void);
extern "C" __declspec(dllimport) void objc_autoreleasePoolPop(void *);

struct __AtAutoreleasePool {
  __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}
  ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
  void * atautoreleasepoolobj;
};

可以看到autoreleasepool是一个由objc_autoreleasePoolPush()objc_autoreleasePoolPop()和一个atautoreleasepoolobj组成的结构体苹果开源代码

  1. viewController的生命周期?

(1)- initWithNibName:bundle:(通过.nib创建/init创建时调用, init创建时, 也是调用- initWithNibName:bundle:, 只不过参数全部传入nil); (1-1)- initWithCoder:(storyboard创建时, 那个 storyboard 会在自己内部生成一个nib, 将nib放入一个coder中); (2)- awakeFromNib:; (3)- loadView:当需要用到view的时候,但是view还没有初始化时会调用; (4)- viewDidLoad:view已经加载完毕; (5)- viewWillAppearview即将显示; (6)- updateViewConstrains: 更新view的约束; (7)- viewWillLayoutSubviews; (8)- viewDidLayoutSubviews:; (9)- viewDidAppear:视图已经完全展示; (10)- viewWillDisappear: 视图即将消失; (11)- viewDidDisappear: 视图已经完全消失; (12)dealloc.

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