类别(Category) Category是ObjC语言中的扩展机制之一,另一个为Protocol。 Category提供一种为某个类添加方法而又不必编写子类的途径。 假设有这样一个类CarInfo: #import <Foundation/Foundation.h> @interface CarInfo : NSObject { } -(void)sayCarBrand; @end @implementation CarInfo -(void) sayCarBrand{ NSLog(@"Car brand: Golf"); } @end Objective-C 是苹果公司开发的面向对象的编程语言,主要用于 macOS 和 iOS 平台的应用开发。在 Objective-C 中,有几个核心的概念和技术,它们是语言的重要组成部分,对于理解和编写 Objective-C 代码至关重要。 ### 类别(Category) 类别是 Objective-C 的一个独特特性,允许开发者在不创建子类的情况下为现有的类添加新的方法。这在很多场景下非常有用,比如扩展系统类的功能,而不去修改其原有的源代码。在上述描述中,`CarInfo` 类被扩展了一个 `sayCarBrand` 方法,这样就可以在任何 `CarInfo` 对象上调用这个新方法,展示汽车品牌。 ```objc @interface CarInfo (CarBrand) -(void)sayCarBrand; @end @implementation CarInfo (CarBrand) -(void) sayCarBrand{ NSLog(@"Car brand: Golf"); } @end ``` ### 拓展(Extension) 扩展(Extension)与类别类似,但通常用于隐藏类的私有实现细节。它可以在不公开声明新属性或方法的情况下,为类添加私有接口。扩展在接口声明时没有类别名,而是在大括号内直接定义。 ```objc @interface CarInfo () // 这是一个匿名的扩展 @property (nonatomic, strong) NSString *brand; @end @implementation CarInfo @synthesize brand; // 只有在这个类的实现文件里,才能访问到 brand 属性 @end ``` ### 委托(Delegate) 委托是 Objective-C 中的一种设计模式,通过设置代理对象来处理特定事件或任务。代理通常遵循一个或多个协议,这些协议定义了代理必须实现的方法。例如,用于处理用户交互的 `UITableViewDataSource` 和 `UITableViewDelegate` 协议。 #### 用协议实现委托模式 ```objc @protocol CarInfoDelegate <NSObject> @optional - (void)carInfo:(CarInfo *)info didChangeBrand:(NSString *)newBrand; @required - (void)carInfoDidStart:(CarInfo *)info; @end @interface CarInfo : NSObject @property (nonatomic, weak) id<CarInfoDelegate> delegate; @end @implementation CarInfo - (void)start { // 开始操作,然后通知代理 [self.delegate carInfoDidStart:self]; } @end ``` #### 用类别实现委托模式 虽然不常见,但也可以通过类别来实现委托。不过,通常使用协议更为灵活和标准。 ### KVC(Key-Value Coding) KVC 是一种间接访问对象属性的技术,无需直接调用 getter 或 setter。通过字符串键值来访问或修改属性值。 ```objc CarInfo *car = [[CarInfo alloc] init]; [car setValue:@"Audi" forKey:@"brand"]; NSLog(@"%@", [car valueForKey:@"brand"]); // 输出 "Audi" ``` ### KVO(Key-Value Observing) KVO 允许一个对象观察另一个对象的属性并响应其变化。当被观察的属性改变时,观察者会收到通知。 ```objc [car addObserver:self forKeyPath:@"brand" options:NSKeyValueObservingOptionNew context:nil]; // 当 brand 改变时,会调用这个方法 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if ([keyPath isEqualToString:@"brand"]) { NSLog(@"Car brand changed to: %@", change[NSKeyValueChangeNewKey]); } } // 不再需要观察时,移除观察者 [car removeObserver:self forKeyPath:@"brand"]; ``` ### KVB(Key-Value Binding) KVB 是 Cocoa 框架中的一种技术,用于自动更新界面元素和模型对象之间的数据。在 macOS 开发中较为常用,iOS 开发中不常见。 ### 一些数据类型 - `id`:通用对象指针,可以指向任何类型的 Objective-C 对象。 - `nil`:空对象指针,表示对象不存在,相当于其他语言的 `null` 或 `nullptr`。 - `Nil`:空类指针,表示类不存在,通常用于类的协议指针。 - `SEL`:选择器,代表方法的名称,用于消息发送。 - `IMP`:实现指针,指向方法的具体实现。 - `Method`:方法结构体,包含了方法的名称、选择器和实现等信息。 - `Class`:类对象,代表一个类的实例。 以上就是 Objective-C 的一些基本知识,包括类别、扩展、委托、KVC 和 KVO 等关键概念。理解并熟练掌握这些概念,将有助于你更好地进行 iOS 和 macOS 开发。
- 粉丝: 4w+
- 资源: 135
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 贪吃蛇方案设计的方法.zip
- 微信支付账单(20240731-20240731).zip
- minio20240920.tar
- 集成供应链(Integrated Supply Chain,ISC)核心业务流程再造,华为的最佳实践
- zabbix-server-pgsql-7.0-centos-latest.tar
- zabbix-web-apache-pgsql-7.0-centos-latest.tar
- Altium Designer 24.9.1 Build 31 (x64)
- 基于JAVA的人机对弈的一字棋系统设计与实现课程设计源代码,极大极小搜索和α-β搜索算法
- 电子回单_2024092100085000842531409053050071685353.pdf
- 背景:js多边形渐变网格背景插件效果演示