编写 Objective-C 代码/掌握基本的编程技能 之 读后笔记

时光怂恿深爱的人放手 提交于 2020-03-15 22:03:18
类和接口(任何类可采用)的动态扩展


#import <Gizmo/Gizmo.h>


@interface MyClass : NSObject
{
int count;
id data;
NSString* name;
}
- (id)initWithString:(NSString*)aName;
+ (MyClass*)


对象的类型化:静态类型化、动态类型化
多态性是指不同类型的对象响应同一消息的能力。
为避免声明大量局部变量来储存临时结果,Objective-C 让您嵌套消息表达式。
Objective-C 还提供用于调用存取方法的简单形式--点记法语法。存取接口。
对象隐藏或封装其状态,并显示接口。您还可以使用点记法语法进行赋值.在点记法表达式中,您不能使用对动态类型化的对象(类型为 id 的对象)的引用。


要么将类方法用作工厂方法创建类的新实例,要么访问与该类关联的一些共享信息。


您在类接口中包括方法声明和属性声明。
您在类的头文件中声明公共属性;而在源文件的类扩展中声明专有属性。
控制器对象(如委托和视图控制器)的属性通常应该为专有的。
自定选项来配置属性,以定义存取方法如何表现、属性是否为弱引用,以及是否为只读。选项位于圆括号中,前面是 @property 指令。


编译器自动合成所声明的属性。在合成属性时,它创建自己的存取方法,以及“支持”该属性的专有实例变量。实例变量的名称与属性的名称相同,但具有下划线前缀 。
只有在对象初始化和取消分配的方法中,您的应用程序应该直接访问实例变量(而不是其属性)。
如果您想要让实例变量采用不同名称,可以绕过自动合成,并明确地合成属性。在类实现中使用 @synthesize 编译器指令,让编译器产生存取方法,以及进行特殊命名的实例变量。


同时,在声明属性时,您可以指定存取方法的自定名称。


块是封装工作单元的对象,可作为方法和函数的参数传入,或可从方法和函数中返回。
int (^myBlock)(int) = ^(int num) { return num*multiplier;};
块变量 常量块


块共享局部词法作用范围内的数据。块的这项特征非常有用,因为如果您实现一个方法,并且该方法定义一个块,则该块可以访问该方法的局部变量和参数(包括堆栈变量),以及函数和全局变量(包括实例变量)。这种访问是只读的,但如果使用 __block 修饰符声明变量,则可在块内更改其值。即使包含有块的方法或函数已返回,并且其局部作用范围已销毁,但是只要存在对该块的引用,局部变量仍作为块对象的一部分继续存在。??


协议无需子类化,就可以扩展类的功能。如
UIApplication 类实现一个应用程序必需的行为。UIApplication 类不是强制您对 UIApplication 进行子类化,来接收有关应用程序当前状态的简单通知,而是通过调用指定给它的委托对象的特定方法,为您传送那些通知。实施 UIApplicationDelegate 协议的对象,可以接收那些通知,并提供适当的响应。


扩展一个类:类别和类扩展


您还可以使用称为类扩展的匿名类别,在实现 (.m) 文件中声明专有属性和专有方法。类扩展看起来类似于类别,只是圆括号之间没有文本。


oc中可将消息发送到nil没有任何副作用 ,关键字self和super
self还用于点标记法。在继承自超类的方法的覆盖(即重新实现)中,通常将消息发送到 super。


按对象思考 很经典。。


初始化的目的在于返回有用的对象。
作为一种安全的编程实践,您可以测试返回的对象以验证该对象已经创建。您应该使用初始化程序返回的实例,而不是由 alloc 方法返回的实例。


创建对象两种方式:初始化程序和类工厂方法
1.通过分配并初始化对象来创建对象
2.通过调用类工厂方法创建对象


对象图很重要,因为它是对象存在多久的一个要素。
一个对象未被强引用时,该对象将被释放,对该对象的所有弱引用都会设定为 nil。
@property(weak) id delegate;


可变对象是指在创建后,可以更改其状态的对象。
值对象以对象形式表示标量类型。


有时,使用基本类型(即类型为 int(整型)、float 等的值)更高效、更直接。这种情况的一个主要例子是计算数值。因此,NSNumber 和 NSValue 对象在框架方法中,较少用作参数和返回值。但是,许多框架声明了它们自己的数值数据类型,并将这些类型用于参数和返回值;例如 NSInteger 和 CGFloat。您应该在合适的地方使用框架定义的这些类型,因为它们有助于让您的代码不拘泥于底层平台。


要使用此 NSString 字面常量,只需在普通双引号字符串前面添加 @ 符号
Objective-C 还提供速写记法来创建 NSNumber 对象,从而无需调用初始化程序或类工厂方法,来创建此类对象。
集经常包含值对象,但可以包含任何类型的对象。大多数集都具有对其包含的对象的强引用。


创建集对象时,除了初始化程序和工厂方法,还可以使用容器字面常量 @
有序集合是集合基本定义的一个例外。在有序集合中,集合中的项目顺序很重要。有序集合中测试成员资格比数组中要快。


内省是 Objective-C 和 NSObject 类的强大且实用的功能,使您能在运行时了解有关对象的某些东西。
对象可以遵守协议,而不实现其可选方法。


请注意,对象相等与对象相同是有分别的。对于后者,请使用相同运算符 == 测试两个变量是否指向同一个实例。


浅拷贝和深拷贝
拷贝行为是特定于某一个类的,具体取决于实例的特定性质。大多数类实现深拷贝,即复制所有实例变量和属性;部分类(如集类)实现浅拷贝,即仅复制对这些实例变量和属性的引用。
具有可变变体和不可变变体的类也声明 mutableCopy 方法,来创建对象的可变副本。例如,如果在 NSString 对象上调用 mutableCopy,您会获得 NSMutableString 的实例。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!