Objective-C学习笔记
发布日期:2021-06-30 19:38:32 浏览次数:2 分类:技术文章

本文共 2585 字,大约阅读时间需要 8 分钟。

表1 Objective-C代码的文件扩展名

扩展名 内容类型
.h 头文件。头文件包含类,类型,函数和常数的声明。
.m 源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。
.mm 源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。

当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import,你的代码也应该是这样的。

Objective-C提供了一个助记符可以方便地从常量值创建NSString对象

在普通的双引号字符串前放置一个@符号,如下面的例子所示:

NSString* myString = @"My String\n";NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];// 从一个C语言字符串创建Objective-C字符串NSString*  fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

Objective-C的类规格说明包含了两个部分:接口和实现。接口部分包含了类声明和实例变量的定义,以及类相关的方法。实现部分包含了类方法的实际代码。图1展现了声明一个叫做MyClass的类的语法,这个类继承自NSObject基础类。类声明总是由@interface编译选项开始,由@end编译选项结束。类名之后的(用冒号分隔的)是父类的名字。类的实例(或者成员)变量声明在被大括号包含的代码块中。实例变量块后面就是类声明的方法的列表。每个实例变量和方法声明都以分号结尾。

图1 类声明

类实现的位置也由两个编译选项确定,@implementation和@end。这些选项给编译器提供了要将方法和对应类联系起来,所需的范围信息。因此方法的定义和接口中对应的声明是匹配的,只是多了个代码块而已。

  列表1 类实现

@implementation MyClass    - (id)initWithString:(NSString *) aName{
if (self = [super init]) {
count count = 0; data = nil; name = [aName copy]; return self; }} + (MyClass *)createMyClassWithString: (NSString *) aName{
return [[[self alloc] initWithString:aName] autorelease];}@end

Objective-C对变量包含的对象支持强弱两种类型。强类型指针的变量类型声明包含了类名。弱类型指针使用id作为对象的类型。弱类型指针常用于类的集合,在集合中对象精确的类型可以是未知的。如果你用过强类型语言,你也许觉得使用弱类型变量可能会带来问题,但是他们实际上给了Objective-C程序巨大的灵活性,而且使它更强大。

  下面的例子里,展示了MyClass类的强类型和弱类型声明变量:

MyClass*  myObject1;    // 强类型id        myObject2;    // 弱类型
Objective-C中的类可以声明两种类型的方法:实例方法和类方法

声明由一个减号(-)开始,这表明这是一个实例方法。

消息被中括号( [ 和 ] )包括。中括号中间,接收消息的对象在左边,消息(包括消息需要的任何参数)在右边。例如,给myArray变量传递消息insertObject:atIndex:消息,你需要使用如下的语法:

[myArray insertObject:anObj atIndex:0];

当给类发消息,你指定的方法必须被定义为类方法,而不是实例方法。你可以认为类方法跟C++类里面的静态成员有点像(但是不是完全相同的)。

类方法的典型用途是用做创建新的类实例的工厂方法,或者是访问类相关的共享信息的途径。类方法声明的语法跟实例方法的几乎完全一样,只有一点小差别。与实例方法使用减号作为方法类型标识符不同,类方法使用加号( + )

属性是用来代替声明存取方法的便捷方式。属性不会在你的类声明中创建一个新的实例变量。他们仅仅是定义方法访问已有的实例变量的速记方式而已。

属性声明应该放在类接口的方法声明那里。基本的定义使用@property编译选项,紧跟着类型信息和属性的名字。你还可以用定制选项对属性进行配置,这决定了存取方法的行为。下面的例子展示了一些简单的属性声明:

@property BOOL flag;@property (copy) NSString* nameObject; // 在赋值过程中复制对象.@property (readonly) UIView* rootView; // 只创建一个getter方法

使用属性另外的好处就是你可以在代码中访问他们的时候,使用点语法,如下面的例子所示:

myObject.flag = YES;CGRect   viewFrame = myObject.rootView.frame;
协议
声明了可以被任何类实现的方法。协议不是那些类本身。他们仅是定义一个接口,其他的对象去负责实现。你实现了协议里面的方法,就叫做符合协议。

协议的声明跟类接口的声明很像,只是协议没有父类,而且他们不会定义任何实例变量。下面的例子展示了一个有一个方法的协议声明:

@protocol MyProtocol        - (void)myProtocolMethod;@end

转载地址:https://linxinfa.blog.csdn.net/article/details/51772097 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:装饰器模式
下一篇:C++ 信号处理

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月15日 08时43分45秒