- 浏览: 1756831 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173650
-
Android学习笔记
浏览量:368109
-
iBatis开发详解
浏览量:189254
-
Objective-C学习...
浏览量:99824
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
接上文
多态是一个典型的面向对象概念。Objective-C中的多态可以使得来自不同类的对象定义同名方法。
我们来看下面的示例,分数类Fraction我们已经多次涉及到了,我们来回顾一下我们分数类的定义:
方法convertToNum是将分数转化为小数形式,setTo...over方法是设置分数的,reduce是约分方法,这是对于分数处理所特有的方法和命名。那么print和add方法则是两个比较普通的方法。那么我们定义其它类也可以包含print和add方法来实现其它效果。
比如数学概念中有复数的概念,复数由实部和虚部构成,那么我们创建复数类Complex的定义,代码可以是这样的:
复数类的定义比较简单,仅仅是为了说明问题,定义了实部和虚部的两个double类型变量, print和add方法的命名是和分数类Fraction一致的,只是设置复数的方法命名和setTo...over不同,那么它的实现如下:
对定义的三个方法进行实现,代码很简单,意思就不过多解释了,那么来看主函数:
我们分别定义了两个分数和两个复数,分别对其使用add方法进行相加,然后使用print方法进行打印。编译运行这个程序,我们得到如下的结果:
那么可以看到,我们分别得到了正确的结果。在Objective-C中不同的类使用相同的方法名的能力称为多态。那么我们在开发一组类时,它们可以使用相同的方法名而每个类又有不同的实现代码。那么多态还允许你创建心类时,这些新类也使用相同的方法名。
我们继续来深入说明。在Objective-C中有一种数据类型比较特殊,就是id类型。id表示一种通用的对象类型,也就是说id可以用来存储任何类的对象。那么我们使用这种方式来存储不同类型的对象时,在程序运行期间,这种数据类型的优势就体现出来了,我们修改上面的主函数,使用id类型来看一下:
和之前的程序相比,这里我们定义了id类型的result变量,并且删除了分数类和复数类各自的result对象,统一使用id类型的变量作为替代,那么运行程序,我们先来看一下结果:
可以看到,程序依然正确运行,我们得到了想要的结果。这里我们将result定义成id类型,那么它就可以表示任何类型的对象,请特别注意,这个声明不是指针类型,不加星号。那么在做分数运算时,result首先被赋值为Fraction类型,这是Objective-C程序运行时的动态类型和动态绑定机制,这种动态机制就是在运行时先判断对象所属的类,然后调用对应的方法,而在编译时是不检查的。依照这个理论,那么在执行复数类的print时,result对象已经赋值为了复数类型的结果,那么自然打印复数。
想想我们之前的矩形和正方形的例子,如果加入了draw方法,那么对于矩形和正方形的实现肯定是不同的。而若在程序中我们可能还会有圆形,三角形等图案,那么若定义了id类型的shape变量,它就可以表示任何图形了,在运行时动态确定结果,动态选择要执行的所属类的draw方法就可以得到不同的图案了,这就是动态类型和动态绑定的实现。
看下面的代码段:
这里我们定义了分数类型的对象f,对f调用了复数类的setReal...addImaginary方法,这显然是无法通过编译的,因为编译器知道f的类型,Fraction类中没有setReal...addImaginary方法的定义或者继承这个方法,那么在编译阶段就会报出错误。这很好理解,接着来看:
这样的代码在编译时不会发生错误,因为data可以表示任意类型,编译器在编译时不会检查对象的具体类型。而当程序运行时,显然会出现问题,因为data是Fraction类型的,而Fraction类型没有定义/继承setReal...addImaginary方法。那么就会出错,这就是运行时报错。
以上两种情况就说明了编译时检查和运行时检查机制。也可以看出如果滥用id类型会埋下的潜在隐患。因为id类型可以看做是动态类型,即编译器不会检查对象的类型,而是在运行时动态确定的,如果对象和要执行的方法不匹配,就会出错。而将变量定义为特定类型的对象时,就是静态类型,静态类型是会接受编译器检查的。很显然静态类型可以在编译阶段就指出错误而且提高程序的可读性。
同时,使用动态类型调用方法时,如果在多个类中定义有同名方法,那么这个方法的各个参数类型和返回值类型要一致。
引入动态类型后,问题随之而来。比如说在运行时如何判断一个对象是某种类型,一个对象是否支持某方法,一个对象是否是某类或是其子类的成员。幸运的是,NSObject类为我们提供了一些方法用于处理这类问题,要使用这些方法,我们需要一些铺垫,首先介绍class方法,看下面的示例代码:
首先我们创建了一个Rectangle对象rect,之后对rect调用class方法返回一个Class类型的对象,然后打印这个cls对象的内容。而下面我们对Square类直接调用class方法,也能返回Class对象,那么编译运行,我们得到如下结果:
我们可以看到通过class方法我们可以获取当前对象的类型,使用类名来调用通常也是为了返回这个类型的对象,他们都是Class类型的对象。那么我们知道class方法的用处后就可以用于判断了,比如下面的代码:
那么我们很容易就能与基础该程序的效果,请看下图所示:
下面介绍@selector指令,该指令用于一个方法名,比如@selector (alloc),它的返回值是SEL类型,这个指令所获取的SEL类型结果也是用于动态类型的一些方法的,这里我们仅仅有个感性认识即可,那么看下面的代码:
这里我们需要将SEL结果转换成NSString类型,那么编译运行,我们会得到如下结果:
那么在后面处理动态类型的方法中,我们会看到@selector指令的具体用途。参考下面的程序:
我们先来看运行结果:
我们逐行来解释一下这个程序,isMemberOfClass : class方法用于判断对象是不是class的成员,返回值为BOOL类型,那么这里我们使用三目运算符来获取BOOL表达式的结果,NSString也是id类型的一种,那么我们使用%@来表示。很显然square对象是Square类的一个成员,而不是Rectangle类和NSObject类的成员。
isKindOfClass: class方法用于判断对象是不是class类或其子类的成员。显然square对象是Square类的成员,是Rectangle类和NSObject类的子类成员。
respondsToSelector : selector方法用于判断对象是否可以响应@selector提供的方法,那么直接看上面的结果即可,不用多说了。instanceRespondToSelector : selector方法用于判断指定的实例能否响应@selector提供的方法,那么直接看结果就行了。
这些方法我们仅仅有个感性认识即可,等后续内容使用到了再做深入了解。
我们知道运用动态类型时在程序执行过程中可能会出现异常,那么如何来处理异常呢?Objective-C中引入@try块儿来处理异常,异常处理在@catch块中进行。我们来看下面的代码:
代码使用的是我们分数和复数的项目,那么为了引发异常,我们将分数类和复数类都使用id类型来表示,显然编译器不会报错,然后我们对两个不同的对象使用add方法,这显然是不可以的,那么将代码放入@try块中,在@catch块中进行异常处理,这里我们仅仅是打印一些异常信息。在@finally块中编写不论异常是否发生,都要执行的代码,那么编译运行后,我们得到如下结果:
之后我们修改代码,不会出现异常时是这样的情况:
此时代码不会出错了,那么编译运行就得到了如下结果:
可以看到@finally块中的语句无论异常是否发生,都会执行。所以它常用来进行连接的关闭等操作。如果想主动抛异常,还可以使用@throw指令来进行,这就是更高级内容了,暂时先不涉及。因为异常处理的开销很大,特别是移动设备对资源占用很敏感,所以非必要,请不要使用异常处理。
接下文
多态是一个典型的面向对象概念。Objective-C中的多态可以使得来自不同类的对象定义同名方法。
我们来看下面的示例,分数类Fraction我们已经多次涉及到了,我们来回顾一下我们分数类的定义:
#import <Foundation/Foundation.h> @interface Fraction : NSObject @property int numerator,denominator; -(void) print; -(double) convertToNum; -(void) setTo:(int) n over: (int) d; -(Fraction *)add:(Fraction *)f; -(void) reduce; @end
方法convertToNum是将分数转化为小数形式,setTo...over方法是设置分数的,reduce是约分方法,这是对于分数处理所特有的方法和命名。那么print和add方法则是两个比较普通的方法。那么我们定义其它类也可以包含print和add方法来实现其它效果。
比如数学概念中有复数的概念,复数由实部和虚部构成,那么我们创建复数类Complex的定义,代码可以是这样的:
#import <Foundation/Foundation.h> @interface Complex : NSObject @property double real,imaginary; -(void) print; -(void) setReal:(double)r andImaginary:(double)i; -(Complex *) add:(Complex *) c; @end
复数类的定义比较简单,仅仅是为了说明问题,定义了实部和虚部的两个double类型变量, print和add方法的命名是和分数类Fraction一致的,只是设置复数的方法命名和setTo...over不同,那么它的实现如下:
#import "Complex.h" @implementation Complex @synthesize real,imaginary; -(void) print { NSLog(@"%g + %gi",real,imaginary); } -(void) setReal:(double)r andImaginary:(double)i { real=r; imaginary=i; } -(Complex *) add:(Complex *)c { Complex *result=[Complex new]; result.real=real+c.real; result.imaginary=imaginary+c.imaginary; return result; } @end
对定义的三个方法进行实现,代码很简单,意思就不过多解释了,那么来看主函数:
#import "Fraction.h" #import "Complex.h" int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *fractionA = [Fraction new]; Fraction *fractionB = [Fraction new]; Fraction *resultFraction; [fractionA setTo:1 over:3]; [fractionB setTo:2 over:5]; [fractionA print];NSLog(@" +");[fractionB print]; NSLog(@"---"); resultFraction=[fractionA add:fractionB]; [resultFraction print]; Complex *complexA=[Complex new]; Complex *complexB=[Complex new]; Complex *resultComplex; [complexA setReal:10.0 andImaginary:2.3]; [complexB setReal:-5.0 andImaginary:3.6]; [complexA print];NSLog(@" +");[complexB print]; NSLog(@"---------"); resultComplex=[complexA add:complexB]; [resultComplex print]; } return 0; }
我们分别定义了两个分数和两个复数,分别对其使用add方法进行相加,然后使用print方法进行打印。编译运行这个程序,我们得到如下的结果:
那么可以看到,我们分别得到了正确的结果。在Objective-C中不同的类使用相同的方法名的能力称为多态。那么我们在开发一组类时,它们可以使用相同的方法名而每个类又有不同的实现代码。那么多态还允许你创建心类时,这些新类也使用相同的方法名。
我们继续来深入说明。在Objective-C中有一种数据类型比较特殊,就是id类型。id表示一种通用的对象类型,也就是说id可以用来存储任何类的对象。那么我们使用这种方式来存储不同类型的对象时,在程序运行期间,这种数据类型的优势就体现出来了,我们修改上面的主函数,使用id类型来看一下:
#import "Fraction.h" #import "Complex.h" int main(int argc, const char * argv[]) { @autoreleasepool { id result; Fraction *fractionA = [Fraction new]; Fraction *fractionB = [Fraction new]; [fractionA setTo:1 over:3]; [fractionB setTo:2 over:5]; [fractionA print];NSLog(@" +");[fractionB print]; NSLog(@"---"); result=[fractionA add:fractionB]; [result print]; Complex *complexA=[Complex new]; Complex *complexB=[Complex new]; [complexA setReal:10.0 andImaginary:2.3]; [complexB setReal:-5.0 andImaginary:3.6]; [complexA print];NSLog(@" +");[complexB print]; NSLog(@"---------"); result=[complexA add:complexB]; [result print]; } return 0; }
和之前的程序相比,这里我们定义了id类型的result变量,并且删除了分数类和复数类各自的result对象,统一使用id类型的变量作为替代,那么运行程序,我们先来看一下结果:
可以看到,程序依然正确运行,我们得到了想要的结果。这里我们将result定义成id类型,那么它就可以表示任何类型的对象,请特别注意,这个声明不是指针类型,不加星号。那么在做分数运算时,result首先被赋值为Fraction类型,这是Objective-C程序运行时的动态类型和动态绑定机制,这种动态机制就是在运行时先判断对象所属的类,然后调用对应的方法,而在编译时是不检查的。依照这个理论,那么在执行复数类的print时,result对象已经赋值为了复数类型的结果,那么自然打印复数。
想想我们之前的矩形和正方形的例子,如果加入了draw方法,那么对于矩形和正方形的实现肯定是不同的。而若在程序中我们可能还会有圆形,三角形等图案,那么若定义了id类型的shape变量,它就可以表示任何图形了,在运行时动态确定结果,动态选择要执行的所属类的draw方法就可以得到不同的图案了,这就是动态类型和动态绑定的实现。
看下面的代码段:
Fraction *f = [Fraction new]; [f setReal:10.0 addImaginary:3.6];
这里我们定义了分数类型的对象f,对f调用了复数类的setReal...addImaginary方法,这显然是无法通过编译的,因为编译器知道f的类型,Fraction类中没有setReal...addImaginary方法的定义或者继承这个方法,那么在编译阶段就会报出错误。这很好理解,接着来看:
id data=[Fraction new]; [data setReal:10.0 addImaginary:3.6];
这样的代码在编译时不会发生错误,因为data可以表示任意类型,编译器在编译时不会检查对象的具体类型。而当程序运行时,显然会出现问题,因为data是Fraction类型的,而Fraction类型没有定义/继承setReal...addImaginary方法。那么就会出错,这就是运行时报错。
以上两种情况就说明了编译时检查和运行时检查机制。也可以看出如果滥用id类型会埋下的潜在隐患。因为id类型可以看做是动态类型,即编译器不会检查对象的类型,而是在运行时动态确定的,如果对象和要执行的方法不匹配,就会出错。而将变量定义为特定类型的对象时,就是静态类型,静态类型是会接受编译器检查的。很显然静态类型可以在编译阶段就指出错误而且提高程序的可读性。
同时,使用动态类型调用方法时,如果在多个类中定义有同名方法,那么这个方法的各个参数类型和返回值类型要一致。
引入动态类型后,问题随之而来。比如说在运行时如何判断一个对象是某种类型,一个对象是否支持某方法,一个对象是否是某类或是其子类的成员。幸运的是,NSObject类为我们提供了一些方法用于处理这类问题,要使用这些方法,我们需要一些铺垫,首先介绍class方法,看下面的示例代码:
#import "Square.h" int main(int argc, const char * argv[]) { @autoreleasepool { Rectangle *rect=[Rectangle new]; Class cls=[rect class]; NSLog(@"%@",cls); NSLog(@"%@",[Square class]); } return 0; }
首先我们创建了一个Rectangle对象rect,之后对rect调用class方法返回一个Class类型的对象,然后打印这个cls对象的内容。而下面我们对Square类直接调用class方法,也能返回Class对象,那么编译运行,我们得到如下结果:
我们可以看到通过class方法我们可以获取当前对象的类型,使用类名来调用通常也是为了返回这个类型的对象,他们都是Class类型的对象。那么我们知道class方法的用处后就可以用于判断了,比如下面的代码:
#import "Square.h" int main(int argc, const char * argv[]) { @autoreleasepool { Rectangle *rect=[Rectangle new]; Square *square=[Square new]; Rectangle *rectangle=[Rectangle new]; if([rect class]==[rectangle class]){ NSLog(@"rect & rectangle is the same class"); } if([square class]==[rect class]){ NSLog(@"square & rect is the same class"); } } return 0; }
那么我们很容易就能与基础该程序的效果,请看下图所示:
下面介绍@selector指令,该指令用于一个方法名,比如@selector (alloc),它的返回值是SEL类型,这个指令所获取的SEL类型结果也是用于动态类型的一些方法的,这里我们仅仅有个感性认识即可,那么看下面的代码:
#import "Square.h" int main(int argc, const char * argv[]) { @autoreleasepool { SEL sel=@selector(setSide); NSLog(@"SEL=%@",NSStringFromSelector(sel)); } return 0; }
这里我们需要将SEL结果转换成NSString类型,那么编译运行,我们会得到如下结果:
那么在后面处理动态类型的方法中,我们会看到@selector指令的具体用途。参考下面的程序:
#import "Square.h" int main(int argc, const char * argv[]) { @autoreleasepool { Square *square=[Square new]; NSLog(@"%@",[square isMemberOfClass:[Square class]]?@"YES":@"NO"); NSLog(@"%@",[square isMemberOfClass:[Rectangle class]]?@"YES":@"NO"); NSLog(@"%@",[square isMemberOfClass:[NSObject class]]?@"YES":@"NO"); NSLog(@"%@",[square isKindOfClass:[Square class]]?@"YES":@"NO"); NSLog(@"%@",[square isKindOfClass:[Rectangle class]]?@"YES":@"NO"); NSLog(@"%@",[square isKindOfClass:[NSObject class]]?@"YES":@"NO"); NSLog(@"%@",[square respondsToSelector:@selector(setSide:)]?@"YES":@"NO"); NSLog(@"%@",[square respondsToSelector:@selector(setWidth:andHeight:)]?@"YES":@"NO"); NSLog(@"%@",[Square respondsToSelector:@selector(alloc)]?@"YES":@"NO"); NSLog(@"%@",[Rectangle instanceRespondToSelector:@selector(setSide:)]?@"YES":@"NO"); NSLog(@"%@",[Square instanceRespondToSelector:@selector(setSide:)]?@"YES":@"NO"); NSLog(@"%@",[Square isSubclassOfClass:[Rectangle class]]?@"YES":@"NO"); } return 0; }
我们先来看运行结果:
我们逐行来解释一下这个程序,isMemberOfClass : class方法用于判断对象是不是class的成员,返回值为BOOL类型,那么这里我们使用三目运算符来获取BOOL表达式的结果,NSString也是id类型的一种,那么我们使用%@来表示。很显然square对象是Square类的一个成员,而不是Rectangle类和NSObject类的成员。
isKindOfClass: class方法用于判断对象是不是class类或其子类的成员。显然square对象是Square类的成员,是Rectangle类和NSObject类的子类成员。
respondsToSelector : selector方法用于判断对象是否可以响应@selector提供的方法,那么直接看上面的结果即可,不用多说了。instanceRespondToSelector : selector方法用于判断指定的实例能否响应@selector提供的方法,那么直接看结果就行了。
这些方法我们仅仅有个感性认识即可,等后续内容使用到了再做深入了解。
我们知道运用动态类型时在程序执行过程中可能会出现异常,那么如何来处理异常呢?Objective-C中引入@try块儿来处理异常,异常处理在@catch块中进行。我们来看下面的代码:
#import "Fraction.h" #import "Complex.h" int main(int argc, const char * argv[]) { @autoreleasepool { id result; id fractionA = [Fraction new]; [fractionA setTo:1 over:3]; id complexA=[Complex new]; [complexA setReal:10.0 andImaginary:2.3]; @try { result=[fractionA add:complexA]; } @catch (NSException *exception) { NSLog(@"Caught: %@%@",exception.name,exception.reason); } @finally { NSLog(@"In finally"); } } return 0; }
代码使用的是我们分数和复数的项目,那么为了引发异常,我们将分数类和复数类都使用id类型来表示,显然编译器不会报错,然后我们对两个不同的对象使用add方法,这显然是不可以的,那么将代码放入@try块中,在@catch块中进行异常处理,这里我们仅仅是打印一些异常信息。在@finally块中编写不论异常是否发生,都要执行的代码,那么编译运行后,我们得到如下结果:
之后我们修改代码,不会出现异常时是这样的情况:
#import "Fraction.h" #import "Complex.h" int main(int argc, const char * argv[]) { @autoreleasepool { id result; id fractionA = [Fraction new]; [fractionA setTo:1 over:3]; id fractionB=[Fraction new]; [fractionB setTo:10 over:18]; @try { result=[fractionA add:fractionB]; } @catch (NSException *exception) { NSLog(@"Caught: %@%@",exception.name,exception.reason); } @finally { NSLog(@"In finally"); } } return 0; }
此时代码不会出错了,那么编译运行就得到了如下结果:
可以看到@finally块中的语句无论异常是否发生,都会执行。所以它常用来进行连接的关闭等操作。如果想主动抛异常,还可以使用@throw指令来进行,这就是更高级内容了,暂时先不涉及。因为异常处理的开销很大,特别是移动设备对资源占用很敏感,所以非必要,请不要使用异常处理。
接下文
发表评论
-
Objective-C学习笔记12:高级数据类型一
2013-03-03 21:52 5067接上文 之前介绍过变量和数据类型,那么我们来看 ... -
Objective-C学习笔记十:继承二
2013-03-02 21:27 4826接上文 之前 ... -
Objective-C学习笔记九:继承一
2013-01-12 20:32 15105接上文 继承是面向对象的一个核心概念。在Obj ... -
Objective-C学习笔记八:类的定义二
2013-01-06 11:00 5370接上文 我们继续来扩展分数类Fraction, ... -
Android学习笔记17:中级视图组件DatePicker和TimePicker
2013-01-05 12:08 16237接上文 HTML5出现之前,我们在Wweb开发 ... -
Objective-C学习笔记七:类的定义一
2013-01-05 10:53 8703接上文 我们还是结合之前分数的示例来说明,只是 ... -
Objective-C学习笔记六:选择结构二
2013-01-03 20:24 5626接上文 之前介绍的都是独立的if选择结构,其实 ... -
Objective-C学习笔记五:选择结构一
2013-01-02 21:37 5746接上文 选择结构,或者称为分支结构,是编程语言 ... -
Android学习笔记16:布局管理器的嵌套
2012-12-31 12:29 9720接上文 布局管理器的嵌套就是将多种布局管理器混 ... -
Objective-C学习笔记四:循环结构
2012-12-31 11:07 8673接上文 ... -
Android学习笔记15:绝对布局管理器AbsoluteLayout
2012-12-29 12:13 11506接上文 有相对布局管理器,对应的,我们还有绝对 ... -
Objective-C学习笔记三:基本数据类型和表达式
2012-12-29 12:06 10185接上文 任何编程语言都会有数据类型,比如在Ja ... -
Objective-C学习笔记二:面向对象概述
2012-12-29 11:49 7183接上文 从字面来理解Objective-C就是 ... -
Android学习笔记14:相对布局管理器RelativeLayout
2012-12-28 13:25 14797接上文 相对 ... -
Objective-C学习笔记一:第一个应用程序
2012-12-27 12:17 14434iOS程序是基于Object ... -
Android学习笔记13:表格布局管理器TableLayout
2012-12-27 11:54 19043接上文 在Web开发中,我们会接触到形形色色的 ... -
Android学习笔记12:框架布局管理器FrameLayout
2012-10-10 10:09 19933接上文 框架布局管理器是Android布局管理 ... -
Android学习笔记11:线性布局管理器LinearLayout
2012-10-02 13:51 15846接上文 和Java GUI部分的概念类似,布局 ... -
Android学习笔记十:基本视图组件:ImageView和ImageButton
2012-09-08 14:05 21657接上文 在Web ... -
Android学习笔记九:基本视图组件:Spinner
2012-09-02 19:58 50197接上文 在Web开 ...
相关推荐
1. **Objective-C是C的超集**:Objective-C在C语言的基础上增加了面向对象的特性,如类、继承、多态等。它允许程序员通过消息传递来调用对象的方法,而不是像C那样直接调用函数。 2. **消息传递**:在Objective-C中...
**Objective-C**是一种面向对象的编程语言,它在C语言的基础上增加了面向对象的功能,并且是开发iOS应用的主要语言之一。尽管Swift已经成为苹果官方推荐的新一代编程语言,但Objective-C仍然拥有大量的代码库和丰富...
此外,Objective-C支持动态类型和运行时特性,这使得在程序运行过程中可以改变对象的类型,或在运行时决定要执行的方法,这是许多其他静态类型语言所不具备的。然而,这也对调试和性能优化提出了挑战,因此理解何时...
Objective-C 使用动态类型和运行时系统,允许在程序运行时决定消息的接收者,这使得 Objective-C 有着更大的灵活性,比如动态绑定和多态。 通过以上介绍,我们了解了 Objective-C 的基本结构和面向对象特性。学习 ...
Objective-C(简称Obj-C或Objective-C)是苹果公司基于C语言构建的一种面向对象的编程语言,广泛应用于iOS和Mac OS X操作系统。本教程将深入探讨Object-C的基础概念、语法特性以及实际开发中的应用,旨在帮助初学者...
Objective-C是C语言的超集,它引入了面向对象的概念,如类、对象、继承、多态等。学习OC首先要掌握以下基础知识: 1. 对象和类:OC中的所有数据都是对象,而对象是由类创建的。类是对象的模板,定义了对象的属性...
C++支持类、对象、封装、继承和多态,而Objective C通过消息传递机制实现这些特性,更接近于Smalltalk的风格。 2. **命名规则与语法**:Objective C的语法比C++更显式,比如方法名前面带有“-”(实例方法)或“+”...
本资源"我的笔记:iOS学习笔记"似乎是一个开发者分享的个人学习资料,其中可能涵盖了Objective-C的基础知识、iOS应用开发实践以及对一些第三方控件的分析和使用。 首先,Objective-C作为iOS开发的基础,其语法特性...
Objective-C,简称Object-C,是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,添加了Smalltalk风格的消息传递机制。本笔记主要关注的是Object-C中的自定义类的定义与调用,这是理解面向对象编程的关键...
Objective-C是C语言的超集,它引入了Smalltalk的面向对象特性,如消息传递、类别(Category)、协议(Protocol)等。在iOS开发中,它提供了UIKit框架,该框架包含了许多用于创建用户界面和处理用户交互的类。`@...
- **Objective-C**:在C语言基础上增加了面向对象特性,主要应用于Apple的iOS和Mac OS X系统开发。 - **Python**:作为一种解释型、面向对象的脚本语言,Python以其简洁的语法和强大的库支持在数据处理、Web开发和...
学习Objective-C,你需要理解类、对象、继承、多态等面向对象的概念,同时还需要掌握Objective-C的动态性,如消息发送、类别(Category)和协议(Protocol)的使用。在iOS开发中,UIKit框架是构建用户界面的核心,...
本文将深入探讨从标题和描述中提及的iOS学习笔记,特别是关于OC面向对象编程的一些关键概念和实践。 面向对象编程(OOP)是OC的核心,它强调通过封装、继承和多态来组织代码。在OC中,类(Class)是对象的蓝图,...
1. **基础概念**:OC是C语言的超集,它引入了消息传递机制和动态类型,使得代码更具灵活性。笔记会详细解释类、对象、继承、封装、多态等面向对象编程的基本概念。 2. **语法特性**:OC的语法包括关键字、方法定义...
本书将介绍 Objective-C 语言的基本概念、数据类型、变量与常量、运算符、程序控制结构、类、继承及多态、分类和协议等内容。 Cocoa 基础 Cocoa 是苹果公司推出的应用程序框架,旨在帮助开发者快速地开发 iOS 应用...
Swift的设计目标是结合Objective-C的动态性与C语言的高效性,同时提供更现代、安全和易于学习的语法。 笔记Swift主要涵盖了以下几个核心知识点: 1. **类型系统**:Swift拥有严格的类型检查,变量和常量在声明时...
"泊学付费网站Swift资料.zip"这个压缩包文件显然包含了与Swift编程相关的学习资源,可能是课程笔记、教程、示例代码或者练习项目,旨在帮助初学者或有经验的开发者提升Swift编程技能。 Swift的特点包括语法简洁、...