分享

快速了解Object

 quasiceo 2014-12-01

2012-07-31 17:37:52|  分类: pad dev |举报 |字号 订阅

想和“苹果”打交道,Object-C还是必不可少的。这里整理了Object-C的主要特性,如果有编程基础的话还是可以很快了解Object-C的。

1:概述:Object-C其实就是对C的扩展,并拥有了一些新的特性,因此我们要有C的基础。苹果公司为Object-C提供了Cocoa框架,方便我们在苹果设备上开发。

2:文件类型:与C不同的是,主文件扩展名为.m,头文件同样为.h。其中头文件用来包含元素声明,函数原型等。C使用#include来包含一个头文件,Object-C同样可以使用,但我们引入了#import,其可以保证头文件只包含一次。

3Hello World程序:

#import <Foundaion/Foundation.h>

int main(int argc,const char *argv[]){

NSLog(@"hello world");

return (0);

}

NSLog函数相当于C中的printf函数,我们仍然可以使用printf,但NSLog加入了一些新的内容,如时间戳,换行符等。‘NS’前缀表示这个函数来自于NEXTSTEPCocoa框架。

4:字符串

Object-C的字符串与C的字符串不同,是用Unicode编码来代替了ASCII编码。由于Object-C完全兼容C,为了区分,字符串前面用@

       如:NSString *name = @"Chase";

       NSString同样是不可修改的,每一次改动都会重新生成一个新的对象,如果想要修改则要是用NSMutableString,它是NSString的子类。

       如:NSMutableString *foo = [@"Chase" mutableCopy];

              [foo appendString:@"I am happy"]

NSString 方法mutableCopy返回NSMutableString

5:类

·1:类的声明:声明开始使用@interface,结束定义使用@end;而不是使用class

@interface Shape : NSObject

{

       @private

int var

@public

Int color;

}

-void setColor : (int ) color;

+voidshowMe;

@end

花括号内是数据成员,在Object-C里我们叫:instance variables(实体变量iVars)。

与其他的语言一样,Objective-C也支持publicprivate还有protected作用域限定, 缺省就是protected

·2:类中方法的定义

减号“-”声明的方法为:实体方法(instance method)

              加号“+ 声明的方法:类方法(class method);相当于java中的静态函数

类方法可以创建对象,但创建之后要调用autorelease,因为一旦退出这个方法,我们将无法再控制生成的变量。

        (id) cattleWithLegsCountVersionA:(intcount

    2   {

    3     id ret [[Cattle alloc] init];

    4     //NEVER DO LIKE BELOW

    5     //legsCount count;

    6     [ret setLegsCount:count];

    7     return [ret autorelease];

    8   }

返回值类型用()包住,也可不声明返回值,编译器会自动添加一个id类型的返

回值。因此不推荐不写返回值,如果没有直接写(void

       参数定义:方法名字后面继续加:符号,表示参数。同样是()包住类型后面写变量名称,如果有多个,则依次书写即可。

(返回值类型)方法名字:(变量类型变量名字 标签1:(变量类型变量1名字;

 

·3:类的实现:使用命令:@implementation

@implementation Shape

-void setColor : (int ) color

{

//code

}

+voidshowMe

{

//code

}

@end

       我们可以在这里实现没有声明的方法,但它并不会成为私有。

 

·4:类的实例化:创建一个类包含了空间的开辟,成员的初始化。

Object-C中使用id来表示一个对象,实际就是指向对象的指针,但如果明确类型时,应避免使用id,因为不容易看出对象的类型。

 

4 int main (int argc, const char argv[]) {

    5     NSAutoreleasePool pool [[NSAutoreleasePool alloc] init];

    6 

    7     id cattle [Cattle new];    

    8     [cattle setLegsCount:4];

9     [cattle saySomething];

10 

11     [pool drain];

12     return 0;

13 }

[Cattle new]是创建对象,new实际上是allocinit的组合。在Objective-C里面创建对象是一个为对象分配内存和初始化的过程。newalloc还有init定义在超类NSObject里面。

       id 对象名=[类名 alloc];

[对象名字 init];

       由于派生类又有自己的变量需要初始化,因此一般要重写init方法。

-(id)init

{

Ifself = [super init]{

    …

}

Return self;

}

 

       为了便于捕捉失败,我们常将两者写在一起:

    id 对象名 [[类名 alloc] init];

if (对象名){

    ……

}

else{

 

}

·5:调用方法Objective-C里面的方法的使用和其他语言有些不同,Objective-C使用消息(Message)来调用方法。所谓的消息就是一个类或者对象可以执行的动作。消息的格式如下:

[对象或者类名字 方法名字:参数序列];

其中“对象或者类名字”被称作消息的接收器(Receiver),)方法名字被称作选择器(Selector)或者关键字(Keyword)方法名字:参数序列被称为一个消息(Message)Objective-C在编译的过程当中,编译器是会去检查方法是否有效的,如果无效会给你一个警告。但是编译器并不会阻止你执行,因为只有在执行的时候才会触发消息,编译器是无法预测到执行的时候会发生什么奇妙的事情的。

接上篇

6
:继承:

·1:声明类时后面的冒号即表示要继承的类。

@interface Shape : NSObject

Object-Cjava一样仅支持单根继承。

self关键字相当于this,用来访问当前类里的变量或方法。

super关键字同super,用来调用父类

Bull *blackBull [Bull new];

 

6:重新编译问题:

由于头文件的相互包含及依赖关系,往往很小的改动就需要重新编译很多的文件。Object-C提供了一种方法可以减少由于依赖引起的重新编译:@class 来告诉编译器这是一个类,编译器只需要通过指针来引用它即可,并不需要知道关于这个类的更多信息。以此来减少编译工作。

使用时,我们可以替换掉#import Tire.h

@class Tire;

@class Engine;

@interface Car : NSObject

{

Tire *tires[4];

Engine *engine;

}

这样在编译的时候,编译器便会知道TireEngine都是类,但不知道其它信息,因此如果要调用TireEngine的方法时将不可以。

7:特性property  

之前的settergetter方法的书写也许会比较繁琐,Object-C引入了特性(Property)的概念。用来让编译器自动创建settergetter方法。

@interface Shape : NSObject

{

int var

}

//也可设定权限@property(readonly)  int  var;这样便只生成getter

   @property  int  var; 

.m文件中声明:

    //表示创建该属性的访问器,编译器会自动输入settergetter

    @synthesize var

设置之后便可以通过 setVarvar方法设置和返回var值了。

    如:int a = [self var];

[self setVar:10];

通常情况下特性的名字和变量的名字相同。

特性也不是万能的,它不支持接收额外参数的方法。

8:类别category

       对已经存在的类的扩展,而又不影响原类。Object-C提供了category动态运行时分配,为类添加新的方法。

       1:类别的声明:

              @ interface NSString(NumberConvenience)

-        (NSNumber *) lengthAsNumber;

              @end

              表示类别的名称为NumberConvenience,要扩展的对象为NSString

       2;类别的实现:

              @implementation NSString (NumberConvenience)

 

              @end

       类别不可以添加成员变量,当有命名冲突时,类别的优先级高。

       使用类别,我们可以将一个类分散到多个文件中,因为implementation实现不能有多个文件,以及创建第私有方法的前向引用,向对象添加非正式协议。

       由于类的实现中可以写声明中没有的方法,但编译器会有警告。此时我们可以在类别中声明一下方法,这样便可以通过。

       添加NSObject的类别,被称为“创建一个非正式协议”,表示有一些功能可能希望实现的方法。

9:协议:protocol;类似于java中接口;

       协议的声明:

              @protocol  NSCopying

              -(id) copyWithZone(NSZone *) zone;

@end

       协议没有变量,实现协议的类需要实现协议定义的所有必须实现的方法。

       @interface Car : NSObject <NSCoping,NSCoding>

       如果定义可选则实现的方法,则可以使用@optional,其后的方法都将是可选的。


10BOOL类型

相当于C中的bool类型(truefalse),Object-C提供了BOOLYESNO)。

其实BOOL类型为singed charYESNO是宏定义的10;注意,对于非0的整数同样认为是真,因此我们不要简单的和YES比较。或者应该统一成YES


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多