OC学习篇之---类的定义 分类: IOS 2014-12-01 22:45 4481人阅读 评论(0) 收藏

以前已经介绍了OC中的一个程序HelloWorld:http://blog.csdn.net/jiangwei0910410003/article/details/41578003,今天咱们继续学习OC中类的相关知识。

OC和C的最大区别就是具备了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,若是学过Java的话,那么对类和对象的概念就不陌生了,由于Java是很是纯正的面向对象设计语言。关于类和对象的概念,这里就不仔细介绍了,网上有各类解释。咱们之间来开一下OC中如何定义一个类,如何实例化出一个对象等。java

首先咱们新建一个工程,系统会自动建立main.m文件的,这时候,咱们右键项目,选择New File..web


而后选择OS X中的Source,在选择Cocoa Class,点击下一步学习


点击下一步spa


这里填写如下类的名称,这个和Java中是相似的了,点击下一步:.net


咱们能够看到,新建了一个Person类,可是这个和Java就有点区别了,一个类是有两部分构成的,一个是类的头文件Person.h(通常是在该文件中作定义工做的),还有一个是Person.m文件,这个通常是实现头文件中定义的内容。这个也是延续了C语言中的项目结构吧。通常头文件只负责定义功能,.c文件负责实现具体功能的。这里也是相似吧。设计

下面来看一下Person.h头文件中类的定义格式:指针

//  Person.h
//  02_ClassDemo
//
//  Created by jiangwei on 14-10-10.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    //在{}中定义属性(全局变量/实例变量)
    //注意:只能定义不能赋值,由于这里只是在作声明操做,不能赋值的
    //加上下划线,为了区分局部变量
    NSString *_name;//姓名,默认值是nil:空指针,能够查看定义:#define nil NULL
    NSInteger _age;//年龄,默认值是0
}

//定义方法
//-:实例方法,+:类方法
//格式:方法说明 (返回类型) 方法名 : (参数类型)参数名称
//注意方法名是shopping:,不是shopping,这个要注意
- (void)shopping:(float)price;

//定义方法设置属性值(注意setXXX)
- (void)setName:(NSString *)name;
- (void)setAge:(NSInteger)age;

//定义方法的获取属性值(注意不是getXXX,而是直接的属性名,由于getXXX在OC中还有其余用途)
- (NSString *)name;
- (NSInteger)age;

//多个参数的方法定义
//方法名两部分组成的:setName: setAge:
- (void)setName:(NSString *)name setAge:(NSInteger)age;
//或者方法名:setName: :,后面的能够省略,可是这种方式不建议使用
//- (void)setName:(NSString *)name :(NSInteger)age;

//类方法
//在这个方法中是没法访问属性的,由于属性是属于对象的,不是类的
+ (Person *)newPerson;
@end
首先看到类的定义的关键字是:

@interfacecode


通常类的定义格式为:orm

@interface 类名:NSObject{对象

定义属性

}

定义方法


这里有几点须要说明:

一、OC中任何一个类都是继承NSObject,这个和Java中的Object是一个概念的,因此这里须要导入

#import <Foundation/Foundation.h>

其实Java中的Object对象是在java.lang.*包中的,不过Java并不会导入这个包,由于Object类的类加载器决定的,不须要导入的.

二、这里的继承符号和C++中是同样的,使用冒号

三、在{}类定义类的属性,关于这里所说的属性和Java中的属性不是一个概念了,OC中只要定义在{}中的字段就是类的属性,而Java中是有getXXX/setXXX的方法,才叫属性。同时也得注意,OC中类中定义的属性名是如下划线:"_"开头,为何要这样作,就是为了区分后面的局部变量与其重名了,固然咱们在Java中通常是以m开头,或者其余方式,Java中没有那么强的规范,可是OC中仍是强烈建议用这种方式的,还有一点要注意,在定义设置方法的时候,通常样式是setXXX,可是在定义取值的方法的时候直接是XXX,而不是getXXX了,这个也是和Java有区别的,至于为何这么作,由于get开头的方法已经有其余用处了,后面会说到。这里就注意一下就能够了。

四、在属性定义的后面就是简单的定义方法了


下面在来看一下如何定义方法:

OC中定义方法和Java语言有很大的不一样,因此这里很难记住,若是不经常使用的话,看一下方法的定义格式:

方法说明 (返回类型方法名 : (参数类型)参数名称


一、方法说明有两种:

一种是减号:"-",表示该方法是对象方法,就是必须用对象实例才能调用的

一种是加号:"+",表示该方法是类方法,就是能够用类直接调用的,不须要实例化对象的,相似于Java中的static方法

二、返回类型:这个就简单了,和Java语言很相似了

三、方法名:方法名和Java中就不太同样了,看个例子:

//注意方法名是shopping:,不是shopping,这个要注意
- (void)shopping:(float)price;

这个方法的方法名是

shopping: 是包含冒号的,再看个例子:

 

//多个参数的方法定义
//方法名两部分组成的:setName: setAge:
- (void)setName:(NSString *)name setAge:(NSInteger)age;
多参数的方法定义,那么这个方法的方法名就是 setName:setAge:

四、(参数类型)参数名称:这个和Java也是有很大的区别的,感受像是和Java中定义的相反了,他用括号把类型括起来了。OC中的对象类型和Java中的使用不同,OC中的对象类型至关于C中指针定义样式(类名 *),这点须要注意。


固然在类定义的结束地方使用@end关键字的


看完了类的定义,下面在来看一下类的具体实现了:

Person.m

//
//  Person.m
//  02_ClassDemo
//
//  Created by jiangwei on 14-10-10.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "Person.h"

@implementation Person

//实现方法
- (void) shopping : (float)price{
    NSLog(@"%@ shopping %f",_name,price);
}

- (void)setName:(NSString *)name{
    _name = name;
}
- (void)setAge:(NSInteger)age{
    _age = age;
}
- (NSString *)name{
    return _name;
}
- (NSInteger)age{
    return _age;
}
- (void)setName:(NSString *)name setAge:(NSInteger)age{
    _name = name;
    _age = age;
}
+ (Person *)newPerson{
    return [[Person alloc] init];
}

@end
看到类的实现使用的是 @implementation  关键字

在实现的源文件中,必须导入类的定义的头文件

#import "Person.h"

这样的一种形式,和C语言中的工程结构很是类似。

而后就是对头文件中定义的一些方法的具体实现了,并且在实现文件中,咱们能够访问类中定义的属性。其余的就没有什么难度了,就不在细说了,一样的类的结束标志:@end

类定义和实现都介绍完了,下面来看一下如何使用吧:

main.m

//
//  main.m
//  02_ClassDemo
//
//  Created by jiangwei on 14-10-10.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

//类的定义放在.h文件中
//类的实现放在.m文件中

//定义一个类的步骤
//定义类名、编写类的属性、编写类的行为

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //建立对象
        //在内存中申请一块内存区域
        //Person *person = [Person alloc];
        //调用初始化方法,初始化一些默认数据
        //可能上面申请的内存以前有被使用过,还会有之前的数据。因此咱们须要将其数据清空,这时候就会将默认值进行赋值(至关于清空操做)
        //person = [person init];
        
        //合并
        //这里申请了两块内存:一个是对象指针变量,一个是alloc申请的
        //能够看出alloc/init方法是类方法、能够查看NSObject对象的定义
        Person *person = [[Person alloc] init];
        
        //还有另外的一种方式建立一个对象,可是这种方式不建议使用,由于这种方式至关于把上面的两个合并
        //有时候咱们须要将上面的两个步骤进行分开操做的
        //Person *person1 = [Person new];
        
        //设置名字
        [person setName:@"jaingwei"];
        
        //调用实例方法shopping
        [person shopping:200];
        
        Person *person1 = [[Person alloc] init];
        [person1 setName:@"huangdaoyang"];
        [person1 shopping:300];
        //同时设置两个属性的值,可是这种方式不建议使用,建议使用set方法
        [person1 setName:@"huangdaoyang" setAge:22];
        
        //get方法调用
        NSString *person_name = [person name];
        NSLog(@"name is %@",person_name);
        NSString *person1_name = [person1 name];
        NSLog(@"name is %@",person1_name);
        
        //类方法调用
        Person *person2 = [Person newPerson];
        [person2 setName:@"shixin" setAge:22];
        [person2 shopping:400];
        
        //空指针
        Person *person3 = nil;
        //不执行任何操做,可是也不会报错空指针异常
        [person3 setName:@"空对象" setAge:22];
        
        
    }
    return 0;
}
OC中实例化一个对象的方式是:

Person *person = [[Person alloc] init];

首先是指针类型的样式定义一个变量,而后是调用类的alloc方法,接着调用init方法,这里有点比较奇怪,咱们在定义Person类的时候,没有定义alloc和init方法,这里为何不报错呢?这个就和Java很类似了,由于OC中任何类都是集成NSObject类的,那么天然想到了这两个方法是NSObject定义的。并且咱们能够看到alloc方法是类方法,init是对象方法

同时,OC中的方法调用方式:

对象方法:[对象变量  方法名 参数]

类方法:[类名  方法名 参数]

这里实例化一个对象和Java中有很大的区别的,Java中直接new一个就能够了。这里须要调用两个方法alloc和init

能够这么理解吧:alloc至关于给这个对象分配内存空间,init是调用这个类的构造方法,对属性和字段进行初始化操做

固然上面的实例化操做也能够变成两步:

Person *person = [Person alloc];
//调用初始化方法,初始化一些默认数据
//可能上面申请的内存以前有被使用过,还会有之前的数据。因此咱们须要将其数据清空,这时候就会将默认值进行赋值(至关于清空操做)
person = [person init];
可是OC中建议的方式仍是上面那种。

对象方法的调用,设置名字:

//设置名字
[person setName:@"jaingwei"];


多个参数的对象方法调用,同时设置名字和年龄

//同时设置两个属性的值,可是这种方式不建议使用,建议使用set方法
[person1 setName:@"huangdaoyang" setAge:22];

类方法的调用:
//类方法调用
Person *person2 = [Person newPerson];


总结

好了,关于OC中类的定义以及实现,如何使用就介绍到这里了,咱们在学习的过程当中能够和一门面向对象语言相比较学习,这样可能会学习的快点。

相关文章
相关标签/搜索