iOS面试题(三)

1、Objective-C 中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

2、为什么我们常见的delegate属性都用是weak而不是retain/strong?

是为了防止delegate两端产生不必要的循环引用。
@property (nonatomic, weak) id delegate;

3、什么时候用delete,什么时候用Notification?

Delegate(委托模式):1对1的反向消息通知功能。
Notification(通知模式):只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。

4、你是否接触过OC中的反射机制?简单聊一下概念和使用

1). class反射

  • 通过类名的字符串形式实例化对象。
Class class = NSClassFromString(@"student"); 
Student *stu = [[class alloc] init];
  • 将类名变为字符串
Class class =[Student class];
NSString *className = NSStringFromClass(class);

2). SEL的反射

  • 通过方法的字符串形式实例化方法。
SEL selector = NSSelectorFromString(@"setName");  
[stu performSelector:selector withObject:@"Mike"];
  • 将方法变成字符串
NSStringFromSelector(@selector*(setName:));

5、isa指针问题

isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调 用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass)。根元类的isa指针指向本身,这样形成了一个封闭的内循环。

6、如何访问并修改一个类的私有属性?

1). 一种是通过KVC获取。
2). 通过runtime访问并修改私有属性。

7、一个objc对象的isa的指针指向什么?有什么作用?

指向他的类对象,从而可以找到对象上的方法。

8、怎么用 copy 关键字?

用途:

  1. NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;
  2. block 也经常使用 copy 关键字。
    说明:
    block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy 也无伤大雅,还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。

9、用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?

用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

  1. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。
  2. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
    //总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。

10、这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr;

问题:添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃。
//如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
// copy后返回的是不可变对象(即 arr 是 NSArray 类型,NSArray 类型对象不能调用 NSMutableArray 类型对象的方法)
原因:是因为 copy 就是复制一个不可变 NSArray 的对象,不能对 NSArray 对象进行添加/修改。

答案都是收集而来,如果有什么错误,欢迎指正!

转载于:https://www.cnblogs.com/WinJayQ/p/9108472.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle中修改遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Oracle 11g中想修改表名: rename ASSETPORJECT to ASSETPROJECT; 结果提示:ORA-00054: 资源正忙, 但指定以 NOWA…

NWCD

1.java jdk和jre 求和算法 时间复杂度和空间复杂度 restful风格 微服务 maven中央仓库 项目依赖jar包,换平台运行 同步和异步 设计模式–代理模式 2.linux 僵尸进程和孤儿进程 如何消除僵尸进程 僵尸进程能被kill调吗 磁盘性能分析iostat top free fdisk swap中a…

解决设置了background-size: cover; 但是图片在ios下显示不完整的问题

设置 background-size: 100% 99.9%; 转载于:https://www.cnblogs.com/kugeliu/p/9469207.html

Python学习之路20-数据模型

《流畅的Python》笔记。本篇是Python进阶篇的开始。本篇主要是对Python特殊方法的概述。1. 前言 数据模型其实是对Python框架的描述,它规范了这门语言自身构件模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。不管在哪种框架下写…

String s1==s2面试题

这个程序运行的结果是什么?class StringTest1{public static void main(String[] args) {String s1"equal";String s2 "equal";if(s1s2){System.out.println("s1s2");}else{ System.out.println("s1!s2");} }} 输出 s1…

Vector:动态数组的使用和说明

摘自百度百科: 1. Vector 类在 java 中可以实现自动增长的对象数组; 创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组…

Spring AOP 代理模式

记录几篇关于AOP & 代理模式 的博客,写的非常好,感谢作者分享! Java中的代理模式——静态代理以及分析静态代理的缺点 Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别 Spring中的AOP以及切入点表达式和各种通知 Spring…

mongodb 多表查询

今天有一个业务涉及到mongodb的多表查询,大体记录下语句结构 db.table_a.aggregate([ {$lookup:{from:"table_b",localField:"userid",foreignField:"userid",as:"organization_doc"}}, //联表B{ $project:{ _id:1, card…

跨平台多线程编程

多线程介绍POSIX 1003.1-2001 定义了多线程编程的标准API。这个API就是广为人知的pthreads。它的目的在于为跨平台编写多线程程序提供便利。多线程程序的编写本文介绍了Linux 和 WIN32 平台下的多线程程序的编写方法Linux 系统对 pthreads 提供了良好的支持。一般地安装完Linux…

方法重载和方法重写

方法重载 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 (2) Java的方法重载,就是在类中可以…

shell获取/etc/passwd中的用户名和id

核心思想:cut 关键词:head tail cut #!/bin/bash # get the information about /etc/passwd PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHfile"/etc/passwd" linewc -l $file | cut -d" "…

进度条控制(Windows 公共进度栏控件的功能)

MSDN:https://msdn.microsoft.com/zh-cn/library/sys15k39.aspx 构造 CProgressCtrl 对象:  CProgressCtrl(); 创建进度栏控件:  virtual BOOL Create( DWORD dwStyle(风格), const RECT& rect(位置大小), CWnd* pParentWnd(父窗体),…

本地浏览器缓存sessionStorage(临时存储) localStorage(长期存储)的使用

对浏览器来说,使用 Web Storage 存储键值对比存储 Cookie 方式更直观,而且容量更大,它包含两种:localStorage 和 sessionStorage sessionStorage(临时存储) :为每一个数据源维持一个存储区域&am…

HTML5的历史

HTML5和WHATWG[1] 2004年Opera的IanHickson(现在Google工作)发起的HTML新标签扩展以适应新的web应用,该发起遭到W3C的拒绝,而W3C凭空杜撰的作风引起了部分人的不满,来自Opera,Apple,以及Mozilla的代表开始…

B-TREE、B+TREE、数据库索引

推荐文章: B-Tree详解 SQL夯实基础(五):索引的数据结构 MySQL B树索引和哈希索引的区别 感谢作者分享!

《重构-改善既有代码的设计》-第1例:租赁影片(1)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 买了《重构 - 改善既有代码的设计 》一书,一直没有好好看,大致过了下也觉得只是有点点印象而已,最后…

java类加public和不加public

加public表示全局类,该类可以import到任何类内。不加public默认为保留类,只能被同一个包内的其他类引用。

STL数据结构

STL数据结构 1.priority_queue #include<queue> pritority<int>q;(大根堆) priority_queue<int,vector<int>,greater<int> >q;(小根堆) struct no{ int x,v; bool operator <(const no &T)const{return v>T.v;} // v值xiao的优先 }; q…

《netty实战》阅读笔记(2)——Netty 的数据容器ByteBuf

ByteBuffer 当我们进行数据传输的时候&#xff0c;往往需要使用到缓冲区&#xff0c;常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer。 实际上&#xff0c;7种基础类型&#xff08;Boolean除外&#xff09;都有自己的缓冲区实现&#xff0c;对于NIO编程而言&#xff0c;我们…

JAVA HASHMAP 用法

import java.util.HashMap;public class Student { String name; String sex; public Student(String n,String s) { namen; sexs; } public String toString(){ return ("姓名:"name"\n""性别:"sex"\n…