iphone(2)-----语言基础(objective-c)

来源:互联网 发布:微博域名搜索 编辑:程序博客网 时间:2024/06/14 20:47

学习IPhone的语言基础---objective-c

在这里只是提到部分(具体的见objective-c相关书籍):

面向对象概念

Class:实例的蓝本,是实例的一个抽象,它里面可以定义一组数据和代码。其实类本身也时一个对象,它所代表的类型叫做类。还有一个新类型,该新类型被定义为selector.

Instance:实例,是一个class的具体实现。

Method:方法,也就函数,是一个实例所能执行的函数功能

InstanceVariable:一组属于实例的特定数据


面向对象中的几个重要词汇

封装:当你想把实施的细节隐藏在公共借口之后,因此公共接口是实例方法,那也是你所暴露给客户的东西。通常我们把大部分的接口以对象的方式暴露给应用开发人员。

多态性:多个对象可以响应,或者相同名称的方法,但是当你调用这些方法是会产生不同的结果。多态性是指你可以对于多个对象使用一个相似的接口,你不一定要知道在运行时发送方法到什么类型的对象中,但是它仍然有用。

继承:当你继承一个父类时,当前类则具有了父类中所有的非private属性和方法。在在子类中,你可以重写或者重载父类中已有的方法,子类是父类的扩展,在父类的基础上,子类可以拥有自己的属性和方法等。


objective-c中基本上所有的类都是继承于NSObject


NSObject对象会做内存管理,基本上可以认为它用来处理分配和销毁对象。在objective-c中,所有的对象都是引用计数的。NSObject实际上有保持和释放对象(该对象最终采用引用计数)的协议。所有的对象都会被引用计数。

UIControl,继承自NSObject,它实际上基本实现了一些一个控制对象需要做的事情,触摸跟踪以及当我们的手指在屏幕中的控件上移进移出时,知道我们的手指的位置


Objective-C

Objective-CC的一个扩展,任何C程序都能编译和运行在Objective-C上。Objective-C只支持单一继承,但是可以实现多条协议,这里的协议类似于java中的接口。协议基本上是多个方法的集合,如果你要实现一个协议,你必须实现协议中的所有方法。但是在Objective-C2.0中引入了新特性,就是在一些特殊的协议中有一些方法的实现是可选的。大多数UIKit中的委托,委托基本上是一个对象需要去访问另一个对象的问题,其他对象就成为第一个对象的委托。如果有一个定义好的委托协议,这个委托必须被实施以至于实现委托的对象就知道在委托中可以调用什么方法。

Objective-C中有一个动态连接库,基本上所有的方法分派都是懈怠的,方法并没有绑定编译的时间。当你发送消息给对象时,该代码将以不确定的消息运行直到该消息实际发出了一个运行时间时间,送任何消息时,编译器不会去决定哪段代码需要执行。

Objective-C也是一个松散的类型,Objective-C中引入了一个新的类型叫做id,它基本上是一个对象的引用,对象的类型是不确定的,对于编译器来说,该对象可以实现任一方法。它直到的任何对象都可能实现。所以如果你将消息发送到一个id类型的对象,那么该类型会在运行时才被确定。



动态运行时间

所有Objective-C的对象都是在堆里分配好的,所以它们都是动态的。当你创建一个对象,它会在你销毁它之前一直存在。它不会在你推出功能时销毁,因为它们不在方法堆的范围之内。


类与实例方法

+代表是类方法,可以通过类直接访问。这些是消息直接发送给类对象进行处理的。

-代表是实例方法,可以通过实例进行访问。

通常会看到这个方法,+(idalloc;表示这个类当你分配一个新的实例,你需要使用alloc,返回预分配autoreleased对象的便利方法。


消息语法

receiver message];

receiver是我们的实例,message是我们要发到receiver的消息。

receiver messageargument];

argument是要传递的参数

receiver messagearg1 andarg2:arg2......];//多个参数

注意:参数的名字和顺序很重要。


术语

消息语法:

[receivermethod:argument]

消息

[receivermethod:argument]

Selector

[receivermethod:argument]

方法

消息所选择的代码


方法和Selector之间的不同:

我们可以把它们比作是c语言中的方法和方法指针。c语言的功能基本上是实际运行的代码,你定义了一个方法,然后在里面写一些代码。这些代码就是要执行的东西。但是你可以从你代码的其他位置用指针去引用它,因此如果你有一个指向方法的指针,那就是一个方法指针,但是它并不是方法,而只是指向方法的指针,但是它能够让你调用方法。方法就是你所写的代码。Selector是引用方法的一种途径。因为Objective-C是非常动态的,实际上它不引用那个方法的明确实现。它可以引用带有同样名字的任何功能。


.()语法

Objective-C中引入了.()语法,它实际上是属性的方法,如果你想要获得一个实例上的一个实例变量,你通常会发送一个信息给实例变量或者相关的某事物同名的类.

例如:

[[personchildsetHeight:newheight];(1)

person.child .height=newheight(2)

(1)(2)是等同的,只是语法上有差异而已。如果是(2),编译器会把这些功能转换为调用setHeight方法(相当与是set访问器)



动态类型对象

当我们在定义一个字符串时,我们用法NSString*,然后是变量名,因为实际上它是NSString的一个指针。id是一个隐性指针,当你声明变量时,直接使用id变量名,而不需要用到*,如果你放上*,这个最后会变成指向指针的指针。

objective-C中,只提供了编译时间,并不是运行时间类型检查,在运行时,它不会验证你要发送的信息是否到达你在编译时想要到达的对象那里。所有的类型检查都在编译时完成。

Objective-C引入的另一个新类型是空值对象nil,基本上它是零类型的id,你可以把与一个对象做比较,去检查该对象是否有效,或者把对象初始化为nil。有时候你也可以把它作为参数用在分配里,很多地方会接收nil为有效参数。它依赖于你所发送的特定信息。


Nilnull的不同

objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。而且我们对于nil调用方法,不会产生crash或者抛出异常.


Bool类型

objective-C里有一个单独的布尔类型,是大写的BOOL,取值为大写的YESNO,虽然也定义了大写的TRUEFALSE,但是YESNO是很常用的,但是你也可以设置为10,如果你做了隐性检查,它是否为1并不重要,因为非零值就是真值。


Selectors通过名字定义方法

Selector像是一个功能指针。Selector拥有一个类型SEL,它经常被用在UIControls里面。控件,比如说按钮,会有目标和行为,当用户轻按按钮,会有一些行为的方法,这样就将调用目标对象。在代码中你通常写成:@selector(方法),你也可以直接分配selector到栈里的SEL变量。

例如以下是使用selector的两个例子,

SELaction=[button action];

[buttonsetAction:@selector(start:)] (1)

-(void)setName:(NSString*)name age:(int )age;

SELsel=@selector(setName:age:);

使用selector

可以检查一个对象是否响应特定的selector

idobj;

SELsel =@selector (start:);

if([objrespondsToSelector :sel]){

[objperformSelector:sel withObject:self ];

}




通过一个对象可以知道它属于哪个类。

ClassmyClass=[myObject class];

NSStringmyClassName=[myObject className];

检查对象的类型

if([myObject isKindOfClass:[UIControl class]])

{

}

检查对象类型但是不是其子类的方法

if([myObject isMemberOfClass:[NSString class]])

{

}

isMemberOfClassisKindOfClass之间区别是:我们可以使用isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员。例如:我们已经成NSObject派生了自己的类,isMemberOfClass不能检测任何的类都是基于NSObject类这一事实,而isKindOfClass可以。

比较两个对象是否相同

==比较的是指针的值是否相同,即地址是否是一样的。

isEqual比较的是类本身的属性是否相同,比较的是值


isEqual是所有的NSObject都实现的方法,所有NSObject都实现的另外一个功能是description方法,默认的实现只是返回该对象所对应的类名称以及对象的指针。你可以在子类中重写它。-(NSString*)description;

%@是用来格式化字符串的格式。

NSLog是在控制台输出数据。

@是定义字符串的格式



原创粉丝点击