Objective-C-一个简单的类

对于没有过任何面向对象编程经验或者没有过编程经验的人来说,看不太懂“面向对象”这4个字,其实并没有多么高深,它只是一种解决问题的思想。在面向过程中这种思想中,我们解决问题的方式就是把问题分成若干个步骤,然后用函数实现每一个步骤,运行时一个一个调用,直观的能看到解决问题的过程;面向对象呢,会把问题抽象出实体,变得模块化,由实体再引发事件,通过这些事件让问题得以解决。那我们再细想,这些“面向对象”中实体引发的某个事件,其实现过程还不是得有个“面向过程”?没错,面向对象的方法也会有面向过程的影子,用C语言可以写出面向对象的程序,用Java和C++也可以写出面向过程的程序,之所以称他们为面向对象的语言,是因为他们的语言特性更易于实现面向对象的编程方法。由于面向对象的过程需要把对象进行实例化,消耗资源,所以性能相比面向过程较低;又因为面向对象具有封装、继承多态等特性,相比面向过程更易于复用、扩展、维护,更加灵活。两种思想的区别,以我的表达水平,并不是一两句话就说的清,大家不断向后学习,多接触面向对象语言的特性,自然就有体会了,只有做一些东西,才能对这些概念理解到位。

这篇就来讲一下OC中类、对象、成员变量、方法,他们之间的关系,让大家对OC的面向对象的编程模式有个初步的认识。

OC中类的定义分为两个文件,.h(类的声明文件)和.m(类的实现文件)

1.类的声明.h:

#import 

@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;

@end
2.类的实现.m:

#import "Goods.h"

@implementation Goods
//@implementation后面紧跟的类名,表示究竟要实现哪一个类。
-(void)label{
    price = 20;//在类内的实例方法中可以直接访问成员变量
    NSLog(@"price = %d",price);
}
@end

3.简单用类创建一个对象,调用label方法main.m:

#import 
#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继承自一个父类,之后我们会介绍继承的概念,大家暂时知道这个就可以。

这里还要简单的说一下newalloc这种方式有什么区别呢?

实际上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笔记)