`

object c 基础的东西了

阅读更多
减号表示一个函数、或者方法、或者消息的开始 括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。
同一个数组可以保存不同的对象

C用NULL,OC用nil
Objective-C 有种叫做 id 的型别,它的运作有时候像是 void*,不过它却严格规定只能用在对象。
基本类别库 import NSObject.h;BOOL型为YES or NO
#import vs #include:#import。#import 由 gcc 编译器支持。我并不建议使用 #include,#import 基本上跟 .h 档头尾的 #ifndef #define #endif 相同。
Objective-C 的预设扩展名是 .m

类:@interface... @end
Implementation 以 @implementation ClassName 开始,以 @end 结束,用来定义类里的函数

继承(inheritance)
以 Class: Parent 表示,就像上面的 Fraction: NSObject
在 Objective-C 中呼叫 methods 的方法是 [object method],就像 C++ 的 object->method()
[object init] 是一个建构子(constructor)呼叫,负责初始化对象中的所有变量。
[frac setNumerator: 1] 非常简单。它呼叫了 frac 上的 setNumerator method 并传入 1 为参数
Objective-C 也有一个用以释放内存的方式: release
传递多重参数用set..and:[frac2 setNumerator: 1 andDenominator: 5];单重时只用set
加入其它参数的方法就跟加入第二个时一样,即 method:label1:label2:label3: ,而呼叫的方法是 obj

method: param1 label1: param2 label2: param3 label3: param4]

建构子(Constructors)
@interface 里的宣告就如同正常的函式
@implementation 使用了一个新的关键词:super
使用 [super init] 来存取 Super constructor,这个动作需要适当的继承设计

存取权限
预设的权限是 @protected
就像 C++ 中 private: [list of vars] public: [list of vars] 的格式,它只是改成了@private,

@protected, 等等

Class level access
static int count = 0; 这是 class variable 宣告的方式。+(int) initCount; 这是回传 count 值的

实际 method。+(void) initialize method is 在 Objective-C 开始执行你的程序时被呼叫,而且它也

被每个 class 呼叫。

异常情况(Exceptions)
注意:异常处理只有 Mac OS X 10.3 以上才支持
Exceptions(异常情况)的丢出不需要扩充(extend)NSException 对象,你可简单的用 id 来代表它:

@catch ( id e ) { ... }


继承、多型(Inheritance, Polymorphism)以及其它对象导向功能

Objective-C 与 Java 跟 C++ 不一样,你在呼叫一个对象的 method 时,并不需要知道这个对象的型别

。当然这个 method 一定要存在,这称为 Objective-C 的讯息传递。你不需要知道你呼叫 method 的那

个东西是什么型别,如果这个对象对这个讯息有反应,那就会唤起这个 method。

继承(Inheritance)
当你扩充你的 super class(所以只能有一个 parent),你想自订这个 super class 的 method,只要

简单的在你的 child class implementation 里放上新的实作内容即可。

动态识别(Dynamic types)
如-(BOOL) isKindOfClass: classObj,即is object a descendent or member of classObj

Categories
当你想要为某个 class 新增 methods,你通常会扩充(extend,即继承)它。然而这不一定是个完美解

法,特别是你想要重写一个 class 的某个功能,但你却没有原始码时。Categories 允许你在现有的

class 加入新功能,但不需要扩充它。Ruby 语言也有类似的功能。包括-(Fraction*) add: (Fraction*)

f; -(Fraction*) mul: (Fraction*) f; -(Fraction*) div: (Fraction*) f; -(Fraction*) sub:

(Fraction*) f;等

Posing
Posing 有点像 categories,但是不太一样。它允许你扩充一个 class,并且全面性地的扮演(pose)这

个 super class。如果你让 NSArrayChild 扮演 NSArray,则在你的程序代码中所有的 NSArray 都会自

动被替代为 NSArrayChild。[FractionB poseAsClass: [Fraction class]];

Protocols
Objective-C 里的 Protocol 与 Java 的 interface 或是 C++ 的 purely virtual class 相同。
protocol 的宣告十分简单,基本上就是 @protocol ProtocolName (methods you must implement) @end
要遵从(conform)某个 protocol,将要遵从的 protocols 放在 <> 里面,并以逗点分隔。如:

@interface SomeClass <Protocol1, Protocol2, Protocol3> 。
protocol 要求实作的 methods 不需要放在 header 档里面的 methods 列表中。
可以使用 @protocol 来测试对象是否遵从接口。如果对象遵从这个接口,[object conformsToProtocol:
@protocol( SomeProtocol )] 会回传一个 YES 型态的 BOOL 对象。



内存管理

Retain and Release(保留与释放)
Retain 以及 release 是两个继承自 NSObject 的对象都会有的 methods。每个对象都有一个内部计数器

,可以用来追踪对象的 reference 个数。如果对象有 3 个 reference 时,不需要 dealloc 自己。但是

如果计数器值到达 0 时,对象就得 dealloc 自己。[object retain] 会将计数器值加 1(值从 1 开始

),[object release] 则将计数器值减 1。如果呼叫 [object release] 导致计数器到达 0,就会自动

dealloc。
你可以呼叫 [obj retainCount] 来取得计数器的 int 值。

Dealloc
当你的对象包含其它对象时,就得在 dealloc 自己时释放它们。Objective-C 的一个优点是你可以传递

讯息给 nil,所以不需要经过一堆防错测试来释放一个对象。
每个 set method 里的三个动作的顺序非常重要。假设你把自己当参数传给一个自己的 method(有点怪

,不过确实可能发生)。若你先 release,「然后」才 retain,你会把自己给解构(destruct,相对于

建构)!这就是为什么应该要 1) retain 2) release 3) 设值 的原因

Autorelease Pool
当你想用 NSString 或其它 Foundation framework classes 来做更多程序设计工作时,你需要一个更有

弹性的系统,也就是使用 Autorelease pools。当开发 Mac Cocoa 应用程序时,autorelease pool 会自

动地帮你设定好。
#import <Foundation/NSAutoreleasePool.h>
在 Objective-C 有两种管理内存的方法, 1) retain and release or 2) retain and

release/autorelease。对于每个 retain,一定要对应一个 release 「或」一个 autorelease。


Foundation framework classes

Foundation framework 地位如同 C++ 的 Standard Template Library。不过 Objective-C 是真正的动

态识别语言(dynamic types),所以不需要像 C++ 那样肥得可怕的样版(templates)。这个 ramework

包含了对象组、网络、执行绪,还有更多好东西。

NSArray
数组有两种(通常是 Foundation classes 中最数据导向的部分),NSArray 跟 NSMutableArray,顾名

思义,mutable(善变的)表示可以被改变,而 NSArray 则不行。这表示你可以制造一个 NSArray 但却

不能改变它的长度。
NSArray *arr = [[NSArray alloc] initWithObjects: @"Me", @"Myself", @"I", nil];
排序(sorting)展示如何用 selector 来排序一个对象
NSEnumerator 很像 Java 的列举系统

NSDictionary
#import <Foundation/NSDictionary.h> (不明白包含哪些东东)
分享到:
评论

相关推荐

    Object-C 基础语法中文版

    ### Object-C 基础语法中文版 #### 开始吧 **下载这篇教学** 所有这篇初学者指南的原始码都可以由objc.tar.gz下载。这篇教学中的许多例子都是由Steve Kochan在他的书《Objective-C Programming》中撰写的。如果你...

    Object-c模仿系统相册,适合新手

    这两个标签突出了项目的核心内容:使用Object-C语言创建一个相册应用。这表明,开发者将学习到如何处理图像数据,如何实现类似系统相册的界面交互,以及如何在Objective-C的语法和框架下组织代码。 【压缩包子文件...

    中文版苹果object c教程

    因为本书以介绍Objective-C语言的基础知识为内容,即 关于如何使用Xcode的基础知识。通过学习前五章,你将掌握如何在非图形界面下编写基本的代码。 之后的一些章节将教给你如何在图形界面(GUI)下开发简单的程序。...

    matlab面向对象编程教程-A Guide to MATLAB Object-Oriented Programming - Register, CRC 2007.rar

    在上一节为基础,它继承专题探讨,并提出了类向导,一个强大的MATLAB的类生成工具。最后一节将深入讨论先进的战略,包括集装箱,静态变量和功能方面。 拥有超过20年的经验,制定和实施面向对象的软件,专家作者已经...

    JAVA编程基础教程.pptx

    * 在C语言中,几乎所有东西都是函数,而在JAVA语言中,几乎所有东西都是类。 * 在C语言中,可以有多个类在一个文件中,而在JAVA语言中,每个文件只能有一个公共类,该类的名称必须与文件名相同,但以.java为扩展名。...

    javascript 基础学习笔记.pdf

    浏览器的内核或渲染引擎是浏览器中识别代码绘制页面的东西。常见的浏览器内核有: * WebKit 内核(V8 引擎): Google Chrome、Safari、大部分国产浏览器(360、QQ、UC……)、安卓和 iOS 大部分手机浏览器 * Gecko...

    设计模式:可复用面向对象软件的基础--详细书签版

    附录c 基本类 244 参考文献 249  前 言    本书并不是一本介绍面向对象技术或设计的书,目前已有不少好书介绍面向对象技术或设计。本书假设你至少已经比较熟悉一种面向对象编程语言,并且有一定的面向对象...

    第2章程序设计基础.pdf

    对象(Object) 是面向对象方法中的基本概念。对象可以用来表示客观世界中的任何实体,也就是说,应用领域中有意义的、与索要解决的问题有关系的任何事物都可以作为对象,它即可以是具体的物理实体的抽象,也可以是...

    使用C、C++、Java实现面向对象demo

    C++是在C语言的基础上添加了面向对象的特性。C++的类(Class)是实现面向对象的核心,它定义了一组数据成员(即对象的属性)和成员函数(即对象的行为)。C++支持三大面向对象特性:封装、继承和多态。封装允许我们...

    _dev-c-的使用方法汇总.doc

    它可以用来编写 WINDOWS 软件,但是如果您讨厌 WINDOWS 的东西,可以使用 _dev-c-,然后将来可以使用 GCC。 安装 _dev-c- 时,语言选择中文后,可能会出现乱码,这是因为 _dev-c- 的默认语言是英文,所以请直接选择...

    PL/SQL 基础.doc

    3) OCI: C语言和数据库打交道的方法,和Pro*C很相似,更底层,很少用 只适合ORACLE; 4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据库内运行, 其他方法为在...

    jdbc基础和参考

    C语言实现的,提供语言和(基于SQL的)数据库进行交互的“一致性”的接口 JDBC:java版本的ODBC JDBC连接数据库的步骤: 1.注册驱动(加载驱动): 注册的方式: 1.使用类加载器(使用反射的方式) Class.for...

    跟我一起写makefile

    在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 关于程序的编译和链接 ...

    Delphi最新三层源码

    讲点实际的东西。我最讨厌空讲道理。网上讲道理的太多了,不喜欢举例子。 大多数文章中都或多或少的讲到了三层架构。表示层,业务层,数据层。又把业务层再细分,分为外观服务层,主业务服务,及数据库库服务层。 ...

    Linux的makefile语法规则

    在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 二、关于程序的编译和链接 ...

    学习c++的50条忠告(初学者必看)

    - **建议**:可以通过阅读《C程序设计语言》等书籍来打下坚实的C语言基础。 #### 2. 核心参考书籍 - 推荐学习《Thinking in C++》,这本书对于理解面向对象编程非常有帮助。 - **建议**:同时参考《The C++ ...

    WEB 页面标准设计

    例如,让含有 flash 的网页通过 W3C 的 XHTML 验证需要使用 object 标签。但是,如果我们的页面需要在 Microsoft Visual Studio 2005 打开再次进行工作,那么请不要让页面包含 flash 的 object 标签。 最后,我们...

    Javascript如何判断数据类型和数组类型

    这么基础的东西实在不应该再记录了,不过嘛,温故知新~就先从数据类型开始吧 js六大数据类型:number、string、object、Boolean、null、undefined string: 由单引号或双引号来说明,如”string” number:什么整数...

Global site tag (gtag.js) - Google Analytics