Helement 禾元素8H这个牌子怎么样好用吗?

Objective-C是通用语言它是在C语言编程语訁之上开发的,它增加了Small Talk编程语言的功能使其成为面向对象的语言。 它主要用于开发iOS和Mac OS X操作系统及其应用程序

完全支持面向对象的编程,包括面向对象开发的四大支柱 -

现在当我们编译并运行程序时,我们将得到以下结果

即使类别添加的任何方法都可用于类及其子类嘚所有实例,您仍需要在任何源代码文件中导入类别头文件否则您将使用其他方法,否则您将遇到编译器警告和错误

在我们的示例中,由于我们只有一个类因此我们没有包含任何头文件,在这种情况下我们应该包含如上所述的头文件

在开始介绍Objective-C中的Posing之前,我想提醒您注意在Mac OS X 10.5中声明Posing已被弃用,此后无法使用 因此对于那些不关心这些弃用方法的人可以跳过本章。

Objective-C允许类完全替换程序中的另一个类 替换类被称为“冒充”目标类。

对于支持冒充的版本发送到目标类的所有消息都由冒充类接收。

NSObject包含poseAsClass:方法它允许我们如上所述替换現有的类。

  • 一个类只能构成其直接或间接超类之一

  • 冒充类不得定义目标类中不存在的任何新实例变量(尽管它可以定义或覆盖方法)。

  • 目标类在冒充之前可能没有收到任何消息

  • 一个冒充类可以通过super调用重写的方法,从而结合目标类的实现

  • 冒充类可以覆盖类别中定义的方法。

现在当我们在较旧的Mac OS X(V_10.5或更早版本)中编译和运行程序时,我们将得到以下结果

在上面的例子中,我们只是用我们的实现污染叻原始方法并且这将通过上述方法在所有NSString操作中受到影响。

类扩展与类别有一些相似之处但它只能添加到编译时具有源代码的类中(類与类扩展同时编译)。

类扩展声明的方法是在原始类的实现块中实现的因此您不能在框架类上声明类扩展,例如Cocoa或Cocoa Touch类如NSString。

扩展名实際上是没有类别名称的类别 它通常被称为anonymous categories

声明扩展的语法使用@interface关键字就像标准的Objective-C类描述一样,但不表示子类的任何继承 相反,它呮是添加括号如下所示 -

  • 不能为任何类声明扩展,仅适用于我们原始实现源代码的类

  • 扩展是添加仅特定于类的私有方法和私有变量。

  • 扩展内部声明的任何方法或变量即使对于继承的类也是不可访问的

让我们创建一个具有扩展名的SampleClass类。 在扩展中让我们有一个私有变量internalID。

礻例如下所示这不适用于在线编译器。

现在当我们编译并运行程序时,我们将得到以下结果

在上面的示例中,我们可以看到不直接返回internalID 我们在这里删除了UNIQUEINTERNALKEY,并且只为方法getExternalID提供了剩余的值

上面的示例只使用字符串操作,但它可以具有许多功能如加密/解密等。

Objective-C允许您定义协议声明预期用于特定情况的方法。 协议在符合协议的类中实现

一个简单的例子是网络URL处理类,它将具有一个协议其中包含processCompleted委托方法等方法,一旦网络URL提取操作结束就会暗示调用类。

关键字@required下的方法必须在符合协议的类中实现并且@optional关键字下的方法是可选的。

以下是符合协议的类的语法

这意味着MyClass的任何实例不仅会响应接口中特定声明的方法而且MyClass还会为MyProtocol中的所需方法提供实现。 没有必要在类接口中重新声明协议方法 - 采用协议就足够了

如果您需要一个类来采用多个协议,则可以将它们指定为以逗号分隔的列表 我们有一个委託对象,它包含实现协议的调用对象的引用

现在,当我们编译并运行程序时我们将得到以下结果。

在上面的例子中我们已经看到了洳何调用和执行delgate方法。 它以startAction开始一旦进程完成,就会调用委托方法processCompleted以使操作完成

在任何iOS或Mac应用程序中,如果没有代理我们将永远不會实现程序。 因此重要的是我们了解代表的用法。 委托对象应使用unsafe_unretained属性类型以避免内存泄漏

动态绑定确定在运行时而不是在编译时调鼡的方法。 动态绑定也称为后期绑定

在Objective-C中,所有方法都在运行时动态解析 执行的确切代码由方法名称(选择器)和接收对象确定。

动態绑定可实现多态性 例如,考虑一组对象包括Rectangle和Square。 每个对象都有自己的printArea方法实现

在下面的代码片段中,表达式[anObject printArea]应该执行的实际代码茬运行时确定 运行时系统使用方法运行的选择器来识别anObject的任何类中的适当方法。

让我们看一下解释动态绑定的简单代码

现在,当我们編译并运行程序时我们将得到以下结果。

正如您在上面的示例中所看到的printArea方法是在运行时动态选择的。 它是动态绑定的一个示例在處理类似对象时在很多情况下非常有用。

我们可以在类集群中创建子类该类集合定义了一个嵌入在其中的类。 这些类对象是复合对象

所以你可能想知道什么是类集群。 所以我们将首先看到什么是类集群

类集群是Foundation框架广泛使用的设计模式。 类集群在公共抽象超类下组合叻许多私有具体子类 以这种方式对类进行分组简化了面向对象框架的公开可见体系结构,而不会降低其功能丰富性 类集群基于抽象工廠设计模式。

为了简单起见我们创建了一个基于输入值处理它的单个类,而不是为类似的函数创建多个类

例如,在NSNumber中我们有许多类嘚集群,如charint,bool等 我们将它们全部组合到一个类中,该类负责处理单个类中的类似操作 NSNumber实际上将这些原始类型的值包装到对象中。

那究竟什么是复合对象

通过在我们自己设计的对象中嵌入私有集群对象,我们创建了一个复合对象 此复合对象可以依赖于集群对象的基夲功能,仅拦截复合对象希望以某种特定方式处理的消息 此体系结构减少了我们必须编写的代码量,并允许您利用Foundation Framework提供的测试代码

复匼对象必须声明自己是集群的抽象超类的子类。 作为子类它必须覆盖超类的原始方法。 它也可以覆盖派生方法但这不是必需的,因为派生方法通过原始方法工作

NSArray类的count方法就是一个例子; 介入对象的覆盖方法的实现可以简单如下 -

在上面的例子中,嵌入对象实际上是NSArray类型

現在,为了看到一个完整的示例让我们看看下面给出的Apple文档中的示例。

现在当我们编译并运行程序时,我们将得到以下结果

在上面嘚例子中,我们可以看到验证数组的一个函数不允许添加会导致正常情况下崩溃的空对象 但我们的验证阵列负责处理它。 类似地验证陣列中的每个方法都添加了除正常操作序列之外的验证过程。

如果您参考Apple文档您可以看到Foundation框架的详细信息,如下所示

Foundation框架定义了Objective-C类的基础层。 除了提供一组有用的原始对象类之外它还引入了几个定义Objective-C语言未涵盖的功能的范例。 基金会框架的设计考虑了这些目标 -

  • 提供一尛组基本实用程序类

  • 通过为诸如释放之类的事物引入一致的约定,使软件开发更容易

  • 支持Unicode字符串,对象持久性和对象分发

  • 提供一定程度的操作系统独立性以增强可移植性。

该框架由NeXTStep开发后者被Apple收购,这些基础类成为Mac OS X和iOS的一部分

由于它是由NeXTStep开发的,因此它的类前缀為“NS”

NSObject是所有对象的基类,包括基础工具包类 它提供了内存管理的方法。 它还提供了运行时系统的基本接口以及表现为Objective-C对象的能力 咜没有任何基类,是所有类的根

NSDate,NSTimeZone和NSCalendar类存储时间和日期并表示日历信息 它们提供了计算日期和时间差异的方法。 它们与NSLocale一起提供了以哆种格式显示日期和时间以及根据世界中的位置调整时间和日期的方法

文件处理是在NSFileManager类的帮助下完成的。

一组提供对常见Internet协议访问的类囷协议

快速枚举是Objective-C的功能,有助于枚举集合 因此,为了了解快速枚举我们首先需要了解集合,这将在下一节中进行说明

集合是基夲结构。 它用于保存和管理其他对象 集合的整个目的是提供一种有效存储和检索对象的通用方法。

有几种不同类型的集合 虽然它们都能实现能够容纳其他对象的相同目的,但它们的主要区别在于检索对象的方式 Objective-C中使用的最常见的集合是 -

如果您想了解有关这些结构的更哆信息,请参阅数据存储

以下是快速枚举的示例。

现在当我们编译并运行程序时,我们将得到以下结果

正如您在输出中看到的那样,数组中的每个对象都按顺序打印

现在,当我们编译并运行程序时我们将得到以下结果。

正如您在输出中看到的那样与正常快速枚舉相比,数组中的每个对象都以相反的顺序打印

内存管理是任何编程语言中最重要的过程之一。 它是在需要时分配对象的内存并在不再需要时取消分配的过程

管理对象内存是一个性能问题; 如果应用程序不释放不需要的对象,则其内存占用增加并且性能受损

Objective-C内存管理技術大致可分为两类。

  • “手动保留 - 释放”或MRR
  • “自动参考计数”或ARC

“手动保留 - 释放”或MRR

在MRR中我们通过跟踪自己的对象来明确管理内存。 这是使用一个称为引用计数的模型实现的Foundation类NSObject与运行时环境一起提供。

MRR和ARC之间的唯一区别在于保留和释放由我们手动处理而后者则自动处理。

下图表示内存管理在Objective-C中的工作方式示例

A类对象的内存生命周期如上图所示。 如您所见保留计数显示在对象下方,当对象的保留计数變为0时对象将被完全释放,并且其内存将被释放以供其他对象使用

首先使用NSObject中提供的alloc / init方法创建A类对象。 现在保留计数变为1。

现在B類保留了A类的对象,A类对象的保留计数变为2

然后,C类制作该对象的副本 现在,它被创建为A类的另一个实例具有相同的实例变量值。 這里保留计数是1而不是原始对象的保留计数。 这由图中的虚线表示

使用release方法由C类释放复制的对象,并且保留计数变为0因此对象被销毀。

对于初始的A类对象保留计数为2,必须释放两次才能销毁它 这是通过A类和B类的释放语句完成的,它们将保留计数分别减少到1和0 最後,对象被破坏了

  • 我们拥有我们创建的任何对象:我们使用名称以“alloc”,“new”“copy”或“mutableCopy”开头的方法创建对象

  • 我们可以使用retain获取对象嘚所有权:通常保证接收到的对象在接收到的方法中保持有效,并且该方法也可以安全地将对象返回给它的调用者 我们在两种情况下使鼡retain -

    • 在访问器方法或init方法的实现中,获取我们想要存储为对象属性值的对象的所有权

    • 防止对象因某些其他操作的副作用而失效。

  • 当我们不洅需要它时我们必须放弃对我们拥有的对象的所有权:我们通过向对象发送释放消息或自动释放消息来放弃对象的所有权。 因此在Cocoa术語中,放弃对象的所有权通常被称为“释放”对象

  • 您不得放弃您不拥有的对象的所有权:这只是明确说明的先前政策规则的必然结果。

當我们编译上面的程序时我们将得到以下输出。

“自动参考计数”或ARC

在自动引用计数或ARC中系统使用与MRR相同的引用计数系统,但它在编譯时为我们插入适当的内存管理方法调用 强烈建议我们将ARC用于新项目。 如果我们使用ARC通常不需要理解本文档中描述的底层实现,尽管茬某些情况下它可能会有所帮助 有关ARC的更多信息,请参阅

如上所述在ARC中,我们不需要添加release和retain方法因为编译器会对此进行处理。 实际仩Objective-C的基本过程仍然是相同的。 它在内部使用保留和释放操作使开发人员更容易编码而无需担心这些操作,这将减少写入的代码量和内存泄漏的可能性

还有另一个原则叫做垃圾收集,它在Mac OS-X中与MRR一起使用但由于它在OS-X Mountain Lion中的弃用,它还没有与MRR一起讨论过 此外,iOS对象从未拥囿垃圾收集功能 使用ARC,OS-X中也没有使用垃圾收集

这是一个简单的ARC示例。 请注意这不适用于在线编译器,因为它不支持ARC

当我们编译上媔的程序时,我们将得到以下输出

我要回帖

更多关于 8H这个牌子怎么样 的文章

 

随机推荐