Objective-C-一个简单的类
2015-09-22 16:47
423 查看
对于没有过任何面向对象编程经验或者没有过编程经验的人来说,看不太懂“面向对象”这4个字,其实并没有多么高深,它只是一种解决问题的思想。在面向过程中这种思想中,我们解决问题的方式就是把问题分成若干个步骤,然后用函数实现每一个步骤,运行时一个一个调用,直观的能看到解决问题的过程;面向对象呢,会把问题抽象出实体,变得模块化,由实体再引发事件,通过这些事件让问题得以解决。那我们再细想,这些“面向对象”中实体引发的某个事件,其实现过程还不是得有个“面向过程”?没错,面向对象的方法也会有面向过程的影子,用C语言可以写出面向对象的程序,用Java和C++也可以写出面向过程的程序,之所以称他们为面向对象的语言,是因为他们的语言特性更易于实现面向对象的编程方法。由于面向对象的过程需要把对象进行实例化,消耗资源,所以性能相比面向过程较低;又因为面向对象具有封装、继承多态等特性,相比面向过程更易于复用、扩展、维护,更加灵活。两种思想的区别,以我的表达水平,并不是一两句话就说的清,大家不断向后学习,多接触面向对象语言的特性,自然就有体会了,只有做一些东西,才能对这些概念理解到位。
这篇就来讲一下OC中类、对象、成员变量、方法,他们之间的关系,让大家对OC的面向对象的编程模式有个初步的认识。
OC中类的定义分为两个文件,.h(类的声明文件)和.m(类的实现文件)
1.类的声明.h:
3.简单用类创建一个对象,调用label方法main.m:
运行之后结果:
我们可能会发现两个问题:
代码中注释说alloc这个方法就是要为对象分配内存存储空间,可是我们并没有定义它,他到底来自哪儿?
用术语来说:这个alloc继承自一个父类,之后我们会介绍继承的概念,大家暂时知道这个就可以。
这里还要简单的说一下new和alloc这种方式有什么区别呢?
实际上new这个方法本身就在内部实现了alloc并且init的过程,所以Goods
*cup = [[Goods alloc]init];和Goods *cup=[Goods new];这两段代码的结果是一样的,但是如果使用new的话,初始化方法被固定死只能调用init.想要对init后面进行扩展就会很头疼,所以推荐使用alloc这种方式初始化。
一句话说就是:采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。
《Objective-C 程序设计》中提到的一句话非常准确的描述出了本篇文章表达的核心思想:
原文:
The key concepts here are that objects are unique representations from a class ,and each object contains some information(data) that is typically private
to that object .The methods provide the means of accessing and changing that data.
中文版中翻译为:
对象是类的独特表示,每个对象都包含一些通常对该对象来说是私有的信息(数据)。方法提供访问和改变这些数据的手段。
大家自行理解体会下。
这就是一个简单的OC程序,大家是不是已经捕捉到了一些面向对象的思想和感觉了呢?
这篇就来讲一下OC中类、对象、成员变量、方法,他们之间的关系,让大家对OC的面向对象的编程模式有个初步的认识。
OC中类的定义分为两个文件,.h(类的声明文件)和.m(类的实现文件)
1.类的声明.h:
#import <Foundation/Foundation.h> @interface Goods : NSObject /* 1.Goods是自定义的类名 2.类名和类名之间的":"表示的是继承,目前所有自定义类都是继承于NSObject,NSObject是OC所有类的父类 */ { /* 1.OC类的声明中 可以声明任意类型的成员变量 2.成员变量的声明 一定要声明在两个大括号之间 */ int price; //类的所有对象都具有相同的成员变量 比如说商品对象都具有price这个成员变量 } //void test(int a);//OC的类不允许使用C语言的函数定义格式,有其固定的格式 //OC函数(方法)的定义格式: /* -/+(方法的返回值类型)方法名;//无参 -/+(方法的返回值类型)方法名:(参数类型)参数名;//有参 【注意】方法的返回值类型或者方法的参数类型必须使用括号括起来 如果方法带有形参 参数和方法名必须由:隔开 -开头 我们称它为实例方法又称动态方法 这种方法必须通过指向对象的指针调用 +开头 我们称它为类方法又称为静态方法 这种方法必须通过类名调用 */ //在类的声明文件中 只做方法的声明 不实现 //方法的声明位置 在 {}后面 @end之前 -(void)label; @end2.类的实现.m:
#import "Goods.h" @implementation Goods //@implementation后面紧跟的类名,表示究竟要实现哪一个类。 -(void)label{ price = 20;//在类内的实例方法中可以直接访问成员变量 NSLog(@"price = %d",price); } @end
3.简单用类创建一个对象,调用label方法main.m:
#import <Foundation/Foundation.h> #import "Goods.h" //用到了Goods这个类,自然要调用Goods这个头文件 int main(int argc, const char * argv[]) { @autoreleasepool { Goods *cup = [[Goods alloc]init]; /* OC里创建对象的方式 可以直接写成: Goods *cup = [Good alloc]; [cup init]; 还可以写成:Goods *cup=[Goods new]; 要注意加"*",因为在OC中对象是一个指针,指向了后面alloc出来的那块内存。基本数据类型则不需要加"*"。 []表示方法的调用 [类名 alloc]表示的是为(四声)类型为(二声)类名的对象分配内存空间 堆区申请的内存空间初始情况是空的 对象初始化调用的方法是init方法 也就是alloc结束以后要紧接着对其init */ [cup label]; /* []表示方法的调用 [类名 alloc]表示的是为类型为类名的对象分配内存空间 堆区申请的内存空间初始情况是空的 对象初始化调用的方法是init方法 也就是alloc结束以后要紧接着对其init */ } return 0; }
运行之后结果:
我们可能会发现两个问题:
代码中注释说alloc这个方法就是要为对象分配内存存储空间,可是我们并没有定义它,他到底来自哪儿?
用术语来说:这个alloc继承自一个父类,之后我们会介绍继承的概念,大家暂时知道这个就可以。
这里还要简单的说一下new和alloc这种方式有什么区别呢?
实际上new这个方法本身就在内部实现了alloc并且init的过程,所以Goods
*cup = [[Goods alloc]init];和Goods *cup=[Goods new];这两段代码的结果是一样的,但是如果使用new的话,初始化方法被固定死只能调用init.想要对init后面进行扩展就会很头疼,所以推荐使用alloc这种方式初始化。
一句话说就是:采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。
《Objective-C 程序设计》中提到的一句话非常准确的描述出了本篇文章表达的核心思想:
原文:
The key concepts here are that objects are unique representations from a class ,and each object contains some information(data) that is typically private
to that object .The methods provide the means of accessing and changing that data.
中文版中翻译为:
对象是类的独特表示,每个对象都包含一些通常对该对象来说是私有的信息(数据)。方法提供访问和改变这些数据的手段。
大家自行理解体会下。
这就是一个简单的OC程序,大家是不是已经捕捉到了一些面向对象的思想和感觉了呢?
相关文章推荐
- Objective-C的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- 以实例讲解Objective-C中的KVO与KVC机制
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构
- objective-c(六)文件分离,合成存取方法,方法多参数,局部变量,self使用(未完成)