OC 对象创建的本质

博客主要介绍了OC对象创建,用alloc创建、init返回是为了代码重写。还阐述了OC实例对象创建时最小16字节,涉及字节对齐知识,包括arm64中8字节对齐、字节对齐原因及方法,最后提及分析技巧、端点调试技巧、指令集和编译器优化设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OC 对象创建的本质就是用alloc进行创建,用init进行返回。但是为什么init没用任何用处还要写这个呢?这是为了代码的重写。就像我们可以在子类中重写父类的方法时一样的道理。

重点重点重点
在这里插入图片描述
oc的实例对象创建的时候最小16个字节。
size 被计算出来之前是需要对齐,加上一个值,苹果中这个值是0.

什么是字节对齐?
arm64中字节对齐是8字节对齐。
3 --》8
9 --》16
其实字节对齐在浪费空间哦。

为什么要字节对齐?
字节对齐这个是用CPU生产厂家不同来处理的。
CPU早期处理方案:重复读取,这样不会挂掉。从偶数位开始写。
方便读取,提高效率,节约空间(X),节约内存(X)。
字节对齐的方法
方法一:

word_align(int x){
	return (X +7)/8*8;
}

这个代码效率更高一点。
方法二:

word_align(int x){
	return (X +7) >> 3 << 3;
}

方法三:

word_align(int x){
	return (X +7) & ~7;
}

方法二和方法三执行效率是一样的,但是方法三更好。因为写代码不要先考虑性能,应该先考虑可维护性。

总结:
1.通过过来的数据算出size_t。
2.真正的内存分配是在calloc分配内存。
在这里插入图片描述

分析小技巧:
分析会变汇编,分号之后是注释。
lldb
阅读X0寄存器中的内容:
register read x0
阅读X1寄存器中的内容:
register read x1

端点调试技巧:
加上符号端点alloc,就能进入alloc
在这里插入图片描述
在这里插入图片描述
在ram64中:

b是跳转指令:跳过去就不再回来了
bl跳转指令,跳进去再出来。 调用函数

x86是另一种指令集

###设置编译器的优化:
str 将w0中的值放到内存中
orr wzr 将0寄存器,其中z标识zero

编译器的优化设置:Build Settings optimization中更改laver成又快有小。

### Objective-C 中 Auto Layout 的核心原理及实现机制 Auto Layout 是苹果提供的一种灵活的约束系统,用于动态调整用户界面元素的位置和大小。它的本质在于通过一组数学约束条件来描述视图之间的关系,并利用线性代数求解这些约束以计算最终的布局。 #### 1. 自动布局的核心原理 自动布局基于 **Cassowary 线性规划算法** 实现[^3]。这种算法能够高效解决由多个变量组成的线性方程组问题。在 Auto Layout 中,每个视图都有一系列与其位置和尺寸相关的约束条件(constraints),而这些约束被转化为线性不等式或等式的形式。随后,系统会尝试找到满足所有约束的最佳解决方案。 - 每个约束可以表示为 `ax + by ≤ c` 或类似的表达形式,其中 `a`, `b`, 和 `c` 是常量系数,`x` 和 `y` 则代表某个特定属性(比如宽度、高度或者中心点坐标)。 - 如果存在冲突,则优先级较高的约束会被保留下来并影响最终结果;低优先级者可能无法完全达成目标状态。 #### 2. 实现机制详解 当开发者设置好所有的必要约束之后,在运行时阶段,UIKit 将负责执行以下几个主要过程: ##### (1) 构建约束模型 每当有新的约束加入到视图层次结构当中时,框架内部都会创建相应的数据结构用来存储它们的信息。此部分涉及到了 NSLayoutAnchor API 及 NSLayoutConstraint 类型实例化操作[^4]。 ##### (2) 转换成矩阵形式 为了便于后续处理,所有收集起来的约束都需要进一步转换成适合计算机快速运算的标准格式——即增广矩阵(Augmented Matrix)[^5] 。这一环节对于性能优化至关重要,因为它直接影响着后面求解的速度与效率。 ##### (3) 应用 Cassowary 解算器 一旦获得了完整的增广矩阵表述版本后的整个系统的全部约束集合后, 接下来的重任就交给了专门设计出来的简化版 cassowary solver 来完成实际数值上的推导工作.[^6] 最后一步便是依据所得出的结果更新各个参与对象的实际几何参数(如 frame),从而呈现出预期效果给终端使用者. ```objc // 示例代码展示如何添加简单的 auto layout constraints. UIView *redView = [[UIView alloc] init]; [self.view addSubview:redView]; NSLayoutConstraint *widthConstraint = [redView.widthAnchor constraintEqualToConstant:100]; [widthConstraint setActive:YES]; NSLayoutConstraint *heightConstraint = [redView.heightAnchor constraintEqualToConstant:50]; [heightConstraint setActive:YES]; NSLayoutConstraint *centerXConstraint = [redView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor]; [centerXConstraint setActive:YES]; NSLayoutConstraint *centerYConstraint = [redView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor]; [centerYConstraint setActive:YES]; ``` 以上片段演示了怎样运用现代 block-based syntax 定义几个基础性的限制规则以便让红色矩形框居于屏幕中央同时维持固定宽高比例不变. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值