IOS面试题object-c 31-40

 31、 Object-C对象如何进行内存布局?
1,所有父类的成员变量和自己的成员变量(实例变量、私有变量、以及声明为属性生成的变量)都会存放在该对象所对应的存储空间中

2,每个对象内部都有一个 isa 指针,指向他的类对象,类对象中存放着本身对象的a,对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)b,成员变量的列表。

c,属性列表。类对象内也有一个isa指针指向元对象(meta class),元对象内部存放的是类方法列表,类对象内部还有哦一个superclass的指针,指向他的父类对象

每个Objective-C对象都有相同的结构 :对象结构

3,根对象就是NSObject,他的superclass指针指向nil
4 , 类对象既然称为对象,那它也是一个实例,类对象中也有一个isa指针指向他的元类(meta class),即类对象是元类的实例,元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。

总结:


1.对象isa指向类对象,类对象的isa指向元类。元类isa指向根元类。根元类的isa指针指向自己,superclass指针指向NSObject

2.实例对象结构体只有一个isa变量,指向实例对象所属的类。类对象有isa,superclass,方法,属性,协议列表,以及成员变量的描述。

3.所有的对象调用方法都是一样的,没有必要存在对象中,对象可以有无数个,类对象就有一个所以只需存放在类对象中

32、Object-C 对象的isa的指针指向什么?有什么作用?

isa 等价于 is kind of


实例对象的 isa 指向类对象


类对象的 isa 指向元类对象


元类对象的 isa 指向元类的基类


isa 有两种类型
纯指针,指向内存地址
NON_POINTER_ISA,除了内存地址,还存有一些其他信息

33. Object-C中的类方法和实例方法区别和联系?

类方法
类方法是属于类对象的


类方法只能通过类对象调用


类方法中的self是类对象


类方法可以调用其他的类方法


类方法中不能访问成员变量


类方法中不定直接调用对象方法


实例方法


实例方法是属于实例对象的


实例方法只能通过实例对象调用


实例方法中的self是实例对象


实例方法中可以访问成员变量


实例方法中直接调用实例方法


实例方法中也可以调用类方法(通过类名)

34、Object-C 使用什么机制管理对象内存?

1.Objective-C中所有对象都在堆区建立,由程序员负责释放对象所占用的内存。

内存管理机制由3种:垃圾回收、引用计数、C语言方式。

2.垃圾回收是Mac OS10.5提供的新方案,在系统存在一个垃圾收集器。

如果发现某个对象没有被任何对象使用,该对象被自动释放。

3.C语言方式,原始内存管理方式。

用户手动调用malloccalloc函数分配内存,free回收内存。

4.引用计数机制:对象创建后,运行时系统通过对象维护的一个计数器来描述有多少个其他对象在使用自己,当计数器为0时,释放该对象占用的内存空间(该对象调用dealloc方法)。

5,内存管理规则:当使用alloc,new或copy创建一个对象时,对象的引用计数被设置为1.;

向对象发送retain消息,对象引用计数加1;

向对象发送release消息时,对象引用计数减1;

当对象引用计数为0时,运行时系统向对象发送dealloc消息并回收对象所占用的内存。

6.注意:如果类的实例变量时对象指针,则必须重载dealloc方法(例如圆circle类:有一个变量point是Point*类型);

dealloc方法不能直接调用,只有对象的引用计数为0的时候,系统会自动向对象发送dealloc消息。
关于属性的assign、retain、copy关键字生成set方法
assign:简单赋值 浅拷贝 常用于内置类型
-(void)setX(int):aX

35、 使用block时什么情况会发生引用循环,如何解决?

一个对象中强引用了block,在block中又强引用了该对象或该对象的成员变量,就会发生循环引用。

解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用或者将其中一方强制制空xxx = nil
36、 Object-C在block内如何修改block外部变量?
block 是为了支持并行编程,对于普通的 local 变量,我们就不能在 block 里边修改,因为 block 可以被多个线程并行运行,会有问题的,如果在 block 中修改普通变量,编译的时候也会报错。有两种方法:

可以修改static全局变量;
可以修改用关键字 __block 修饰变量;


__block int blockNum = 100;


static int staticNum = 100;


void (^aBlock)(void) = ^(void) {
        NSLog(@">> Num: %d and %d\n",blockNum, staticNum);
        blockNum++;
        staticNum++;
};

aBlock();


NSLog(@">> ALL: %d and %d\n",blockNum, staticNum);

// 打印结果如下
2017-11-30 17:14:43.760052+0800 test[3189:527677] >> Num: 100 and 100
2017-11-30 17:14:50.510695+0800 test[3189:527677] >> ALL: 101 and 101

37、IOS使用系统的某些block api,是否也考虑引用循环问题?
一般不用考虑,因为官方文档中没有告诉我们要注意发生强引用,所以推测系统控件一般没有对这些block进行强引用,所以我们可以不用考虑循环强引用的问题
38、 Object-C中dispatch_barrier_async的作用 ?

barrier:是障碍物的意思,在多个并行任务中间,他就像是一个隔离带,把前后的并行任务分开.


dispatch_barrier_async 作用是在并行队列中,等待前面操作并行任务完成再执行dispatch_barrier_async中的任务,如果后面还有并行任务,会开始执行后续的并行任务

39、 addObserver:forKeyPath:options:context:各个参数的作用 ?
// 添加键值观察
/**
        1. 调用对象:要监听的对象
        2. 参数
                1> 观察者,负责处理监听事件的对象
                2> 观察的属性
                3> 观察的选项
                4> 上下文
*/
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];
// NSObject 分类方法,意味着所有的 NSObject 都可以实现这个方法!
// 跟协议的方法很像,分类方法又可以称为“隐式代理”!不提倡用,但是要知道概念!
// 所有的 kvo 监听到事件,都会调用此方法
/**
        1. 观察的属性
        2. 观察的对象
        3. change 属性变化字典(新/旧)
        4. 上下文,与监听的时候传递的一致
        可以利用上下文区分不同的监听!
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

        NSLog(@"睡会 %@", [NSThread currentThread]);

        [NSThread sleepForTimeInterval:1.0];

        NSLog(@"%@ %@ %@ %@", keyPath, object, change, context);
}
40、 若类有实例变量NSString *_foo,调用setValue:forKey:时,可以以foo还是_foo作为key?
都可以

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

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

相关文章

变量的生命周期详解

变量的生命周期详解 文章目录 变量的生命周期详解前言一、局部变量(Local Variables)二、成员变量(Member Variables)或实例变量(Instance Variables)三、静态变量(Static Variables&#xff09…

CleanMyMac X4.15.0专为macOS设计的清理和优化工具

CleanMyMac X 是一款专为 macOS 设计的清理和优化工具。其基本功能和特点主要包括: 系统清理:CleanMyMac X 可以扫描并清除 macOS 系统中的垃圾文件,如缓存、日志、无用的语言文件等,从而释放硬盘空间并提高系统性能。应用程序管…

linux中操作服务器常用命令

在Linux中操作服务器时,常用的命令包括: ls:列出目录内容。 cd:切换目录。 pwd:显示当前所在的目录路径。 mkdir:创建一个新的目录。 rmdir:删除一个空的目录。 cp:复制文件或目录。…

GPT对话知识库——Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层分别是什么?优先级设置,使用场景,之间的联系

提问模型:GPT-4-TURBO-PREVIEW 提问时间:2024.03.06 1,问: 在实时操作系统freertos中,为什么需要把systick中断优先级设置成最低?systick和pendsv哪一个的中断优先级更低,为什么?举…

Tcp标志位 笔记240309

Tcp标志位 TCP(传输控制协议)的标志位是用于指示TCP报文段中特定控制信息的位字段。这些标志位存在于TCP报头中,用于控制TCP连接的建立、数据传输和终止等过程。以下是TCP标志位的详细说明: SYN(同步标志)…

python爬虫(3)

上一次的代码结果如下: 当然会有一点点不一样是正常的表现,因为这个图本身使用随机数rand函数做的,用其他两种随机函数出来的结果也不会完全相同。 继上节这次带来的是数组的重塑和转置 1、一维数组的重塑 在NumPy模块中的reshape()函数可…

【Vue+ElementUI】Table表格实现自定义表头展示+表头拖拽排序(附源码)

效果图 因项目采用的是Vue2,所以这个功能目前采用的是Vue2的写法。 Vue3请自行修改扩展代码;或收藏关注帖子,后续Vue3项目如有用到会在本帖子更新修改。 安装vuedraggable(拖拽插件) cnpm i vuedraggable先说用法&…

kafka查看消息两种方式(命令行和软件)+另附发送消息方式

1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…

MySQL-Linux安装

JDK安装(linux版) CentOS7环境: jdk下载地址huaweicloud.com 创建目录: mkdir /opt/jdk通过 ftp 客户端 上传 jdk压缩包(linux版本)到 1中目录进入目录:cd /opt/jdk解压:tar -zxv…

QWebEngineView添加chrome参数的方法

开启Chrome DevTools开发者工具 在chrome浏览器调试前端页面,请使用以下方法之一: 方法一:设置环境变量:QTWEBENGINE_REMOTE_DEBUGGING1112 方法二:添加启动参数:--remote-debugging-port1112 方法三&a…

查看自己的ip地址的网站

有时候需要知道自己的ip地址,可以上这个网站查看: What Is My IP? Best Way To Check Your Public IP Address 网站的域名是https://www.whatismyip.com/ 还是挺好记的。

【Redis笔记】基于Redis的Stream结构作为消息队列,实现异步任务

使用redis命令创建消息队列 在redis-cli中执行如下指令 XGROUP CREATE key groupName ID [MKSTREAM]key:队列名称 groupName:消费者组名称 ID:起始ID标示,$代表队列中最后一个消息,0代表队列中第一个消息 MKSTREAM:队列不存在时…

一篇了解电感的使用

一、电感理论基础 1.电感的定义 当电流通过线圈后,会产生磁场,磁感线穿过线圈,产生的磁通量与电流 i有如下关系: 将漆包线、纱包线或塑皮线等在绝缘骨架或磁心、铁心上绕制而成的器件,当线圈通过电流后,在…

linux应用程序需要编写的脚本

每一个程序都按照下面的要求进行脚本编写 多个应用之间联合安装采用编写外围脚本,依次调用多个应用的脚本的方式实现

负载均衡 dubbo

1 自定义负载均衡 dubbo 在 Dubbo 中,用户可以自定义负载均衡策略以满足特定场景的需求。Dubbo 提供了扩展接口 com.alibaba.dubbo.rpc.cluster.LoadBalance 来支持自定义负载均衡算法。 要实现自定义的负载均衡策略,需要完成以下步骤: 创建…

MyBatis Oracle 批量插入数据

MyBatis Oracle 批量插入数据 1.需求描述2.实现方案2.1 循环 insert 插入2.2 insert all 插入2.3 insert union all 插入 3.分析总结 系统:Win10 JDK:1.8.0_351 IDEA:2022.3.3 1.需求描述 在一次项目中实施过程中,后台需要将地区…

给一篇word注音可不可以只要拼音不要汉字 word中如何只保留拼音不要汉字

word中如何只保留拼音不要汉字,如果你想要只保留拼音而去除汉字,可以通过一系列步骤来实现。以下是一个详细的教程,帮助你完成这个任务。 首先,确保你的电脑已经安装了“汇帮注音大师”软件。如果没有,你需要安装一下…

云计算 3月8号 (wordpress的搭建)

项目wordpress 实验目的: 熟悉yum和编译安装操作 锻炼关联性思维,便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…

安卓7原生相机切到视频崩溃

目录 1、查看日志 2、分析日志、提取重点 3、寻找解决方法 author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye_嵌入式,Linux,Qt-CSDN博客daisy.skye擅长嵌入式,Linux,Qt,等方面的知识https://blog.csdn.net/qq_40715266?typeblog 1、查看日志 由于安…

Java实战:利用Redis实现每周热评

本文将详细介绍如何利用Redis实现每周热评的功能。我们将深入探讨Redis的相关概念,如键值对、数据结构、过期时间等,以及如何使用Java语言结合Jedis库进行Redis操作。 1. 引言 在现代的互联网应用中,实时统计和展示热门内容是一种常见的需求…