博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C 学习笔记 - part 2 - 类型定义
阅读量:5843 次
发布时间:2019-06-18

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

关于类的定义:

编译器虽然不强制,但是类型的接口申明与实现代码最好放在两个不同的文件中,以方便使用这些类的开发人员查看。

实现的文件使用 .m 结尾。

接口文件可以使用任何其它的扩展名。因为它经常被 included 到其它的文件中,因此通常使用 .h 的扩展名。

分离接口与实现是面向对象设计方法中推荐的做法。

@interface ClassName : ItsSuperclass

{

    instance variable declarations

}

method declarations

@end

接口定义开始于 @interface ,结束于 @end

静态方法使用 + 开头,实例方法使用 - 号开头,如:

+ alloc;

- (void)display;

实例变量可能与一个实例方法同名。

返回值使用标准C语法进行类型转换。

如果方法返回值或参数未指定类型,那么则使用默认的类型即 id

方法如果接受不定数量的参数,可以使用逗号和省略号:

- makeGroup:group, …;

在使用到相关类型的时候都要使用

#import "SomeClass.h" 来引用一个类型 

类型接口定义时需要 import 它的父类接口

这种链式引用,保证了一个 class 在调用时它的所有父类都已经被引用。

有一点需要注意:如是预编译的包,那么引用的时候需要引用这个预编译的内容而不是原始的 .h 文件。

如果 interface 中还使用到了其它类型的成员变量并且 include 文件里面没有提到的,应该使用 :

@class Retangle, Circle; 方式来引入

它告诉编译器这些 Sybol 是类型名称,不要 import 他们的头文件(仅限于没有使用成员方法的时候),如:

- (void)setPrimaryColor:(NSColor *)aColor;

这样做的目的是让编译器和连接器的可见代码最小并防止循环引用问题。

总之,只在必要的时候才 import interface, 否则只需要 @class 即可。

如果不是公开方法,则不需要在 interface 中申明。

关于类的实现:

类的实现块写法与接口定义的写法类似:

@implementation ClassName : ItsSuperclass

{

    instance variable declarations

}

method definitions

@end

每个实现文件应该 import 它自己的接口定义文件。有些可以安全地省略:父级 class 名称,实例变量申明。

在实例方法中使用实例变量并不需要加前缀,编译器可以自动识别。

In referring to the instance variable of a statically typed object, the structure pointer operator (->) is used.

如果要访问一个类型化变量的成员变量则需要使用 "->"

- makeIdenticalTwin

{

    if ( !twin ) {

        twin = [[Sibling alloc] init];

        twin->gender = gender;

        twin->appearance = appearance;

    }

    return twin;

}

作用域:

@private @protected @public @package

未申请的作用域 默认为 protected

在实例方法中调用其它的实例方法或父级的实例方法:

- reposition

{

    ...

    [self setOrigin:someX :someY];

    ...

}

or:

- reposition

{

    ...

    [super setOrigin:someX :someY];

    ...

}

self 可以被赋值,但是不要这样做, super 只能被用作消息接受方。

下面的代码,在实例方法中需要申请一个与自己相同类型的实例变量:

self = [[Rectangle alloc] init]; // BAD

id newInstance = [[Rectangle alloc] init]; // GOOD

id newInstance = [[self alloc] init]; // EXCELLENT

最后那个最好,因为它始终指向当前的 class (这样不用担心在子类中写死指向到父类的情况)

转载于:https://www.cnblogs.com/darkangle/archive/2011/08/13/2137256.html

你可能感兴趣的文章
linux基础--awk文本分析工具详解
查看>>
Highcharts中Legend动态显示点值
查看>>
结合bgp路由反射器和internet访问的mpls *** 实验
查看>>
MongoDB笔记五——插入操作
查看>>
我的友情链接
查看>>
bash脚本示例1
查看>>
企业应用系统驱动企业业务变革
查看>>
mysql(三)
查看>>
MySQL数据库主从同步(单台2实例)
查看>>
java中按字节获得字符串长度的两种方法 Java问题通用解决代码
查看>>
render: h => h(App) $mount 什么意思
查看>>
HashMap和HashTable简介和区别
查看>>
java json 库之 jackson
查看>>
【图像缩放】最邻近插值
查看>>
一个关于对象引用的bug引发的对于引用类型及数组的简单思考
查看>>
JavaScript 进阶知识 - 特效篇(一)
查看>>
1. Two Sum
查看>>
es6的generators(生成器)
查看>>
阿里数据中台七年演化史——行在口述干货
查看>>
linux常用命令
查看>>