`

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教程

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

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

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

    Android知识体系梳理(4)-Java基础篇-Object方法分析,String的深度解析,String Pool分析,与StringBuilder、StringBuffer的对比

    有的同学要问了,Object和String是我们这一块儿日常一直在使用的东西,为什么要单独拎出来讲呢?其实,他们使用起来虽然简单,但比如Object类是位于java.lang包中的,java.lang是包含了Java最基础和核心的类,在编译...

    Qt基础学习笔记

    Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚...

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

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

    qt入门文档

    Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚...

    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...

    从汇编语言到Windows内核编程

    如果那些东西,也和C语言一样亲切易懂,那多么好啊!这样的话,即便是Windows这样庞大复杂而且封闭的系统,或者是再诡异和隐蔽的破坏技术,至少只要我愿意去探索,对我来说就不再有秘密可言。 其实这个梦想并非不切...

    跟我一起写makefile

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

    Delphi最新三层源码

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

    Linux的makefile语法规则

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

    C++标准库介绍.pdf

    发者必备工具但是Boost中也有很多是实验性质东西在实际开发中实用需要谨慎并且很多Boost中库功能堪称对 语言功能扩展其构造用尽精巧手法不要贸然花费时间研读Boost另外面比如Graph这样库则是具有工业强度结构 良好...

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

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

    JavaScript DOM基础

     O(对象):可以理解为类似window对象之类的东西,可以调用属性和方法,这里说的是document对象;  M(模型):可以理解为网页文档的树形结构; 1.节点  加载HTML页面时,Web浏览器生成一个树形结构,用来表示页面内部结构; ...

    深入剖析Android消息机制原理

    在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统,避免一些低级的错误。在学习Android中消息机制之前,我们先了解与消息...

    英语四级整理笔记.doc

    (具体的)令人讨厌的东西; trouble n. 烦恼,麻烦,问题; worry n. 担心,发愁; anxiety n. 焦虑。 What a nuisance. 真是烦。 IV 搭配关系问题; extent n. 程度; to... extent 到达…程度,在…程度之上; ...

    springmybatis

    1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 &lt;typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/&gt; 这个别名...

    JavaScript中引用vs复制示例详析

    先讲一下很基础的东西,看看js中几种数据类型分别传的什么 引用:对象、数组、函数 复制:数字、布尔 字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这...

    c#学习笔记.txt

    Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中...

Global site tag (gtag.js) - Google Analytics