iOS基础总结理解及相关面试题

iOS基础

  1. 分类(Category)和类扩展(Class Extension)

    分类(Category)
    Category,是表示一个指向分类的结构体的指针,其定义如下:
    
    typedef struct objc_category *Category;
    struct objc_category {
        char *category_name                          OBJC2_UNAVAILABLE; // 分类名
        char *class_name                             OBJC2_UNAVAILABLE; // 分类所属的类名
        struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 实例方法列表
        struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 类方法列表
        struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分类所实现的协议列表
    }
    分类的结构体成员:分类名、分类所属的类名、实例方法列表、类方法列表、分类所实现的协议列表。 
    发现,该结构体包含了分类定义的实例方法与类方法,但结构体里没有属性列表。
    注:(Category局限性上)
        1.Category,原则上只能添加方法,不能添加属性,实际上可以通过其他方式添加属性;
        2.分类中可以写 @property,但不会声明及实现setter/getter;
        3.分类的优先级最高,如果方法名与原有类同名,则会优先调用分类中的方法,优先级顺序 分类>本类>父类;
        
    延伸问题:
    为什么在分类中声明属性时运行不会报错? or 为什么分类中使用@property仍然可以编译通过?
    答:一个类中使用@property声明属性,编译器会自动生成 _成员变量和setter/getter。
        但分类结构体中没有属性列表,所以不会自动生成 _成员变量 和 setter/getter。
        因此使用@property编译和运行都不会报错,一旦使用 _成员变量 或 setter/getter,就会报错。
    
    可不可以手动实现setter/getter方法来避免崩溃?
    答:可以的,OC是动态语言,可以通过runtime添加 setter/getter方法。
        objc_setAssociatedObject(),动态实现setter方法,objc_getAssociatedObject(),动态实现getter方法。
    
    类扩展(Class Extension)
    Extension 是 Category 的一个特例。格式:
    @interface XXX ()
        //私有属性
        //私有方法(如果不实现,编译时会报警,Method definition for 'XXX' not found)
    @end
    
    分类和类扩展的区别
    1.Category原则上只能增加方法(可通过runtime解决增加属性的问题);
    2.Extention可增加方法和属性,只是该属性是@private类型,作用范围是自身;
    3.Category是运行时添加到类中,Extension是编译时添加到类中。
    

    详情链接

  2. atomic 和 nonatomic

    使用@property声明属性时,会使用atomic/nonatomic关键字
    atomic 和 nonatomic 区别在于系统自动生成setter/getter方法不一样
    atomic 系统自动生成的setter/getter方法会进行加锁操作;
    nonatomic 系统自动生成的setter/getter方法不会进行加锁操作。
    
    atomic
    系统生成的setter/getter方法进行加锁操作,但这个锁,仅仅保证了setter/getter存取方法的线程安全。 
    因加锁的缘故,其他线程要读取这个属性时,会先执行完当前操作。
    延伸问题:
    atmoic是线程安全吗?
    答:atomic只是对属性的setter/getter方法进行加锁操作,仅仅是set/get的读取安全,并非真正的线程安全,线程安全还有读取之外的其    他操作。
        (比如:当一个线程正在setter/getter时,有另一个线程    同时进行release操作,这时可能导致crash)
    
    nonatomic
    系统生成的setter/getter方法没有进行加锁操作,读取时不安全,但速度更快,当多个线程同时访问同一属性时,会出现无法预料的结果。
    
    atomic和nonatomic的使用选择
    atomic能够保证setter/getter操作的安全性,但是相对nonatomic更耗费资源,且速度更慢,因此如果没有多线程之间通信操作的情况下,使用nonatomic更好。
    

    详情链接

  3. Objective-C是一门动态语言

    动态,不需要再编译时确定所有的东西,在运行时可以动态添加变量、属性、方法、类。Objective-C可以通过runtime,在运行时动态的添加变量、属性、方法、类,所以说Objective-C是一门动态语言。
    动态性体现:
    1.动态类型。如id类型。静态类型因固定性和可预知性而使用广泛。静态类型是强类型,而动态类型是弱类型,运行时决定接收者;
    2.动态绑定。让代码在运行时判断需要调用的方法,而不是在编译时。与其他面向对象语言一样,方法调用和代码并不是在编译时连接在一起,而是在消息发送时连接,运行时决定调用哪个方法;
    3.动态载入。程序在运行时添加代码模块及资源。用户可根据需要加载可执行代码和资源,而不是启动时家在所有组件。可执行代码中可以含有和程序运行时整合的新类。
    
  4. weak、strong、assign

    由ARC引入
    weak相当于OC中的assign,但是weak只能修饰OC对象,而assign可用于非OC对象,但是它们都不会造成引用计数+1;
    strong相当于OC中都retain,会造成引用计数+1。
    ARC,引用计数机制,OC的内存管理机制。其原理:还要还有一个变量指向对象,对象就会保持在内存中。
    当指针指向新值,或者指针不存在时,相关联的对象就会自动释放。
    
    strong
    strong指针是强引用,能够保持对象的生命,一个对象只要有strong指针指向它就不会被释放;
    相反,如果没有一个strong指针指向它,那么它将自动释放。
    默认所有实例变量和局部变量都是strong指针。
    
    weak
    weak指针是弱指针,同样可以指向一个对象,但是不是该对象的拥有者。即当对象销毁时,weak指针自动指向nil(空指针)。
    这样避免了指针继续指向已释放对象,进而避免了野指针的出现。
    
    延伸问题:
    IBOutlet连出来的视图属性为什么用weak修饰?那些控件对象不会自动释放吗?
    如:@property (nonatomic, weak) IBOutlet UIButton *button;
    答:xib创建或放置控件时,存在该引用关系:
        UIViewController->UIView->subviews->UIButton
        UIView持有了subviews(强引用),所以这里可以使用weak来修饰。
    
    为什么代理要用weak修饰?
    答:防止循环引用。
        如:控制器的view强引用这UITableView,而tableview的delegate又是控制器。
        如果不用weak,Controller->View->delegate-> Controller,就造成了循环引用。
    
    assign
    assign主要用于修饰基本数据类型,如NSInteger,CGFloat等,存储在栈中,内存不用程序员管理。
    
  5. 待更...

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,299评论 8 265
  • OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 OC内存管理 -...
    xx_cc阅读 2,690评论 1 21
  • 每一年都是四季 每一个夏季都很热 每一个冬季都很冷 所以 夏季的时候想冬季 想着冷了不可怕 只要多加衣 冬季的时候...
    柳果果阅读 391评论 0 0
  • 第六天,改变继续坚持着。 下班后我改道老公的办公室,安静地学习了一个小时,走的时候嘱咐老公,车险员给我打了几个电话...
    幸福的原始密码阅读 463评论 0 2