oc知识点总结

本文详细阐述了Objective-C编程中类与对象的基本概念,包括类的接口与实现部分,方法声明与实现,消息发送机制,初始化过程,设置器与访问器,属性声明,继承,以及BLOCK和NS系列常用函数的使用。此外,还介绍了类的扩展、协议、内存管理原则,以及如何通过分类为已有类添加功能。内容涵盖了从基础到进阶的知识点,旨在帮助开发者深入理解Objective-C的核心概念。
类的基本概念

类:具有相同特征和相同行为的事物的抽象
类是一个抽象的概念,在生活中不具体
对象,是类的实例,也就是类的具体体现,是具体的,生活中的万物都是对象

类的接口部分的定义,写在.h文件中


方法声明:
如 - (void)”方法返回类型”  say ”方法名” :(NSInteger)”参数类型” x ”参数名” y ”参数名":(NSInteger)”参数类型” y”参数名”;
如果没有参数 -(void)say;

类的实现部分,写在.m文件中

类的实现,就是实现类的方法

消息 发送 机制 
[ receiver(消息接收者)   message(消息也就是oc的方法)]

接收者:类或者对象(- 对象接收 + 类接收)
消息:方法

Student *student = [Student alloc];*student间接的称为对象
通过[Student alloc]在堆区开辟的空间才是真正的对象,只不过对于指针变量student存储堆区的首地址,通过它才能访问对象,所以我们把指针变量studen叫做对象(但是真正的对象是堆区空间,student本质是一个指针变量)


初始化(赋初值)
        
        Student *student = [[student alloc] init ];

设置器与访问器

设置器(以name为例)
- (void)setName:(NSString *)name;

- (void)setName:(NSString *)name  
{
   self = [super init];
   if(self != nil) {
      _name = name;
    }
    return self;

}

访问器(以name为例)
- (NSString *)name;
- (NSString *)name
{
   return _name;
}
   设置器用来为实例变量赋值,访问器用来取实例变量的值 

属性
只需在.h文件中声明如下属性
@property(nonatomic, retain)NSString *name;
@property(nonatomic, retain)NSString *sex;
@property(nonatomic, assign)NSInteger age;

相当于设置器与访问器,系统自动生成,直接调用即可,默认生成的实例变量可见度为私有

(retain assign copy为语义属性,声明对象时使用retain copy,声明为基本数据类型时用assign)


继承

继承:当多个类出现部分相同实例变量和方法时,就要考虑用继承
继承的使用:将多个类中相同的实例变量和方法提出来写成一个公共的父类.
过继承,子类可以使用父类的实例变量和方法,并且可以添加自己的实例变量和方法.同时可以改写父类的方法.

BLOCK的使用
Block允许嵌套定义,定义时最后加 返回值可以省略
Block变量的初值,Block用来存储函数,所以给Block变量赋值时赋的是整个函数的实现int(^min)(int x, int y) = ^(int x, int y) {

    return x + y;
};
当在Block内部使用外部定义的局部变量时,如果变量没有被Block修饰,则在Block内部不能对他修改,如果想修改,变量必须要有_block修饰        _Block告诉编译器,编译时在Block内部不要把外部变量当做常量使用,还是当做变量使用 如果在Block中访问全局变量,就不需要Block修饰   __Block int b = 10;(双下划线)  int (^min)(int x,int y) = ^(int x, int y){      b = 15;      a = 20;      return x - y
 };       
NSString常用函数
求字符串长度 length
获取字符串中的某个字符 characterAtIndex:
判断字符串是否以指定字符串开始或结束-hasPrefix(开始),hasSuffix(结束)
查找指定字符串的范围 rangeOFString,返回类型为NSRange(结构体类型),操作的为副本.获取给定下标值后的子串,包含指定下标对应的字符串(下标从零开始) stringWithFormat:
获得指定下标之前的字符串,从下标为零开始,但是不包括下标对应的字符(下标从零开始)substringToIndex: 
字符串拼接stringByAppendingFormat:
字符串替换stringWithFormat:
字符串比较 compa:

NSArray常用函数
初始化 initWithObjects:
获取元素个数count
获取指定下标元素objectAtIndex:
获取数组元素下标indexOfObject:
判断是否包含某个对象 containsObject:
数组sortedArrayUsingSelector:
数组遍历,如下例
for (NSString *str in array1) {     NSLog(@"%@", str)
 }
添加元素 addObject:
插入元素insertObject:
删除removeObjectAtIndex:

NSDictionary常用函数
初始化initWithObjectsAndKeys:
求字典中元素个数count
获取所有key  allKeys
根据key获取相应的value(对应的类型要匹配)objectForKey: 
字典快速遍历,如下例
        for (NSString *key in dic) {            NSLog(@"%@", [dic objectForKey:key]);        }
添加元素 setObject:
删除元素 removeObjectForKey:
修改key对应的元素setObject:forKey

NSSet常用函数
初始化 initWithObjects:
获取元素个数count
获取集合中某个元素个数 anyObject
判断集合中是否包含某个对象containsObject:
添加元素 addObject:
删除元素removeObject:

NSNumber常用函数
将基本数据类型转化为NSNumber类型的对象
如例,将字符类型基本数据转化为相应的NSNumber类型的对象
char a = 'f’;
NSNumber *a1 = [NSNumber numberWithChar:a];

NSNumber类型的对象转为基本数据类型
char a2 = [a1 charValue];
NSNumber 对象比较 compare:

NSDate常用函数
求将来或者过去的日期 dateWithTimeIntervalSinceNow:(时间间隔是以秒为单位)
获取两个日期的时间间隔timeIntervalSinceDate:
比较两个日期的早晚 ,获取较早的earlierDate:
获取较晚的laterDate:
 将日期格式串,转换为NSData对象,如下例
 NSString *str = @"20140501 102318"; 创建日期格式化对象 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 设置日期格式(日期格式串中的日期格式保持一致) [formatter setDateFormat:@"yyyyMMdd HHmmss"];  将格式字符串转换为NSData对象(dateFromString:)  NSDate *d = [formatter dateFromString:str];  NSLog(@"%@", d);
类的扩展

分类,类目,category为没有源代码的类添加方法(只添加方法,不添加实例变量是扩展一个类的功能的方式之一,为原有类的扩展的方法会成为原类的一部分,使用即可分类也分为.h(接口部分),以及.m(实现部分).h文件中填写声明的方法,.m文件中填写方法的实现
分类的定义格式.@interface开头 + 扩展的类名(分类名)@end

协议

协议 就相当于任务清单,规定所要做的操作(只有一系列方法的声明)谁服从协议,谁就要实现清单中的方法(完成任务清单的任务),所以协议只有.h文件,没有.m文件
协议要让类服从,服从完协议之后,要实现协议的方法

内存管理
OC中采用引用计数机制,管理内存
内存管理基本原则:如果你对一个对象进行alloc retain copy之后,你就拥有了该对象的所有权,你就必须对它进行release或者autorelease.

只要调用了alloc retain copy,就进行release 或者autorelease
autorelease,会将声明为autorelease的对象放入离他最近的自动释放池中,当自动释放池销毁时,会向池中的每一个对象,发送一个release消息
release,立即释放
当一个类的对象引用计数为零时,系统会自动调用该类的dealloc方法来回收空间,该方法是由系统自动调用,不能手动调用

当把一个对象放入一个集合中(数组,字典,集合)时,会将对象的引用计数+1,因为内部做了retain操作当collocection(集合,字典,数组),空间被回收时,他们会向容器,的每一个元素都发送一个release消息(对应添加元素时的retain操作)当从collection(数组,字典,集合),中移除一个元素时,release该对象,引用计数-1
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
### 数字电路知识点总结 #### 1. 基本概念 数字电路的核心在于利用电源电压的高电平和低电平来分别表示逻辑状态 `1` 和 `0`,从而实现信息的数字化表达[^1]。这种离散化的特性使得数字信号能够抵抗噪声干扰并便于存储和传输。 #### 2. 数字信号与模拟信号的区别 - **模拟信号**:随时间连续变化的物理量,通常用于描述自然界中的真实现象。 - **数字信号**:随时间不连续变化的离散信号,适合计算机和其他数字设备处理[^1]。 #### 3. 进制转换 在数字电路中,常见的进制包括二进制、八进制、十进制和十六进制。掌握不同进制之间的相互转换是理解数字电路的基础之一[^4]。 #### 4. 组合逻辑电路 组合逻辑电路的功能仅取决于当前输入的状态,而不依赖于过去的输入历史。常用的组合逻辑器件包括加法器、编码器、解码器以及多路选择器等。设计这些电路时常借助真值表和布尔代数进行简化。 #### 5. 卡诺图化简 为了减少硬件资源消耗,在实际应用中往往需要对复杂的逻辑函数进行最小项形式或者最大项形式上的化简操作。卡诺图为一种直观有效的工具,可以帮助快速找到最优解决方案[^2]。 #### 6. 触发器与时序逻辑电路 触 发器 是 构 成 各 种 寄 存 器 及 计 数 器 的 基 本 单 元 。 J-K 触 发 器 属 于 边 缘 触 发 类 型 , 它 不 仅 能 实 现 T 触 发 器 功 能 ( 如 置 零 、 置 一 或 保 持 当 前 状 态 ), 更 加 特 别 地 支 持 “翻 转 ”操 作 。 #### 7. OC/OD门的应用场景 OC(Open Collector)门和 OD(Open Drain)门由于其特殊的结构特点——集电极或漏极开路设计,常被用来实现“线与”逻辑功能。这类门电路外部需加上拉电阻才能正常工作,并且主要用于驱动较大功率负载的情况之下[^3]。 #### 8. 计数器的设计技巧 对于特定需求下的计数器构建来说,“同步预置法”是一种非常实用的方法论。比如当希望一个四位二进制计数器达到某个预定数值时自动重置,则可以通过合理配置相应触发器输出端至LOAD端的方式达成目标[^4]。 ```python def binary_to_decimal(binary_str): """将二进制字符串转换为十进制整数""" return int(binary_str, 2) print(binary_to_decimal('1001')) # 输出应为9 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值