03第一个OC类
来源:互联网 发布:java短信接口怎么用 编辑:程序博客网 时间:2024/05/17 07:42
OC是一门面向对象的语言,因此它也有类、对象、静态\动态方法、成员变量的概念。
1.类
在Java中,我们用1个.Java文件就可以描述清楚一个类;在OC中,一般用2个文件类描述一个类
.h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface 和 @end
注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回 值类型、方法接收的参数类型而已,并不会编写方法内部的代码。
.m: 类的实现文件,用于实现.h中声明的方法。类的实现使用关键字 @implementation和@end
2.方法
方法的声明和实现,都必须以+ 或者 - 开头
+ 表示类方法(静态方法)
- 表示对象方法(动态方法)
在.h中声明的所有方法作用域都是public类型,不能更改
3.成员变量
成员变量的作用域有3种
1.@public 全局都可以访问
2.@protected 只能在类内部和子类中访问
3.@private 只能在类内部访问
比Java少了一种作用域:包权限作用域,原因很明显:OC没有包名的概念
用Xcode 创建第一个OC类
1.点击项目文件夹或者文件,选择”New File“
选择Cocoa的”Object-C class“
3.输入类名和选择父类
这里的类名为Student,父类是NSobject
创建完毕后,项目中多了两个文件
* Student.h是类的声明文件,Student.m是类的实现文件
* 默认情况下,这2个文件的文件名跟类名一致
* 编译器只会编译.m文件,并不会编译.h文件
第一个类的代码解析
1.Student.h -类的声明文件 #import <Foundation/Foundation.h>
@interface Student : NSObject
@end
OC中使用关键字@interface 来声明一个类,@interface后面紧跟着类名Student
类名Student后面的冒号”:“ 表示继承,既 Student 继承自 NSObject
因为NSObject 被声明在Foundation.h中,所以在第一行用#import包含了Foundation.h文件。
@end表示类声明结束,@interface和@end是配套使用的。
2.Student.m -类实现文件
#import ”Student.h“
@implementation Student
@end
OC中使用关键字@implementation来实现一个类。@implementation后面紧跟类名,表示究竟实现哪个类
因为Student这个类声明在Student.h中,所以#import "Student.h"
@end 表示类的实现结束。@implementation和@end 配套使用
添加成员变量
正常情况下,我们都是把成员变量定义到头文件中,也就是类的声明文件(.h)中
1.给Student添加一个成员变量
#import <Foundation/Foundation.h>@interface Student : NSObject {
int age;
}
@end
这里定义了一个int类型的成员变量age,age的默认作用域是@protected,既在Student类内部和子类中访问
成员变量必须写在大括号{}里面
2.设置成员变量的作用域
接下来给Student 增加几个不同作用域的成员变量
#import <Foundation/Foundation.h>
@interface Student : NSObject {
int age;
@public
int no;
int score;
@protected
float height;
@private
float weight;
}
@end
这里一共有五个成员变量,其中
@public 作用域 no ,score
@protected作用域 age,height
@private作用域 weight
添加方法
前面我们定义了一个成员变量age,它的作用域是@protected ,外界不能直接访问它。为了保证面向对象数据的封装性,我们可以提供age 的get 和 set 方法,让外界间接访问age。接下来在Student 中添加age 的 get方法和 set方法1.在Student.h中声明方法
#import <Foundation/Foundation.h>@interface Student : NSObject {
int age;
@public
int no;
int score;
@protected
float height;
@private
float weight;
-(int) age;
-(void) setAge:(int)newAge;
}
@end这里声明了age的get方法,方法名就叫做age,OC建议get方法的名字跟成员变量保存一致(在Java中,就应该叫做getAge)
-表示一个动态方法(+则表示静态方法)。age前面的(int)表示方法的返回值为int类型,方法的返回值和参数类型都需要用小括号()包住
在OC方法中,一个冒号:对应一个参数。由于age和set方法接收一个int类型的参数,参数名为newAge,所以(int)newAge前面有一个冒号:
一定要记住:一个冒号:对应一个参数,而且冒号:也是方法名的一部分。set方法的方法名是setAge:,而不是setAge
加入一个方法可以同时设置age和height ,那么就应该这样写:
-(void)setAge:(int)newAge andHeight:(float)newHeight;
这个方法是动态方法、没有返回值,接收两个参数,所以有2个冒号:
这个方法名是 setAge:andHeight:
其实andHeight是可以省略的,它只是为了让方法名念起来顺通一点,也让(float)newHeight 前面的冒号:不那么孤单
2.在Student.m中实现方法
前面已经在Student.h中声明了3个方法,接下来一一实现它们#import "Student.h"
@implementation Student
-(int)age{
return age;
}
-(void)setAge:(int)newAge{
age = newAge;
}
-(void)setAge:(int)newAge andHeight:(float)newHeight{
age = newAge;
height = newHeight;
}
@end
跟Java的比较
如果是在Java中,一个Student.java文件就可以搞定成员变量和方法创建对象
前面已经定义了一个Student类,成员变量和方法都有了,接下来看一下怎么使用这个类创建对象。由于OC程序的入口点是main函数,所以在main.m文件中演示Student类的使用
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc,const char * argv[]){
@autoreleasepool{
Student *stu = [[Student alloc]init];
[stu release]
}
return 0;
}
1.包含Student.h
因为要用到Student这个类,所以在第2行包含了它的头文件
#import "Student.h"
2.创建对象
1.在Java中是使用关键字new 来创建对象,比如new Student(),其实这句代码做了2件事: 给对象分配存储空间
调用Student 的构造方法进行初始化
2.在OC中创建对象也需要按顺序做上述的2件事
1.调用Student类的静态方法alloc 分配存储空间
Student *stu = [Student alloc];
oc方法调用是用中括号[],方法调用者写在括号左侧,方法名写在括号右侧,中间留点空格,因此上面是调用了Student类的静态方法alloc
上面调用的alloc方法会返回分配好内存的Student对象,在等号左边用了一个指向Student类型的指针变量stu来接收这个对象,注意stu左边的*号。所有OC对象都是用指针变量来接收的,如果你不了解指针,你记住下面这点就行了:利用类名定义一个变量时,类名后面一定要带个*号。
alloc方法是这样声明的
+ (id)alloc;
可以看到,它的返回值类型是id,这个id代表任何指针类型,你可以暂时理解为:id可以代表任何oc对象,类似于NSObject *
调用Student 对象的构造方法init进行初始化
stu = [stu init];
看清楚了,由于init是动态方法,所以这里使用stu变量来调用,并不是使用类名来调用。init会返回已经初始化完毕的对象,再次赋值给了stu变量。这个时候Student对象stu才能正常使用
其实,我们最常见的做法是将alloc和init连起来使用:
Student *stu = [[Student alloc] init]
3.销毁对象
由于oc不支持垃圾回收,因此当不再使用某个对象时,需要调用对象的release方法释放此对象。[stu release]
这个release方法在这里调用一次即可,不要觉得多调用多几次,对象就会释放地干净一点,这样做会很危险,容易造成野指针错误
4.其他
也可以调用静态方法new 快速创建一个对象Student *stu = [Studen new];
[stu release];
不过我们还是习惯使用alloc和init来创建对象
前面我们调用了Student 的alloc 、init 、new 方法,但是你会发现Student.h中并没有声明这些方法,为什么我们能够调用呢?原因很简单,这些方法都是父类NSObject的,子类当然可以调用父类方法。
访问公共成员变量和方法
前面已经成功创建了一个Student对象,接下来访问一下它的公共变量和方法。#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc,const char *argv[]){
@autoreleasepool{
Student *stu = [[Student alloc] init];
//访问公共变量no
stu->no = 10;
//调用setAge:方法
[stu setAge:27];
[stu setAge:17 andHeight:1.88f];
int no = stu->no;
int age = [stu age];
//打印
NSLog(@"no is %i and age is %i",no,age);
[stu release];
}
return 0;
}
0 0
- 03第一个OC类
- OC 第一个OC类
- OC -- 第一个类
- 第一个OC类
- 第一个OC的类
- 第一个OC的类
- 第一个OC的类
- 第一个OC类-方法
- OC-第一个类
- OC-第一个类
- 【Objective-C】03-第一个OC程序
- 【Objective-C】03-第一个OC程序
- 【Objective-C】03-第一个OC程序
- 黑马程序员:oc的第一个类
- 03.第一个OC的类
- 第一个OC程序
- 第一个oc程序
- 第一个oc程序
- 使用ggplot2画图
- sgu108
- MySql 命令大全(转载备用)
- Java 多线程之线程安全集合 ConcurrentHashMap、CopyOnWriteArrayList 等
- Android 超高仿微信图片选择器 图片该这么加载
- 03第一个OC类
- 新手报到!
- Android 实现形态各异的双向侧滑菜单 自定义控件来袭
- 大端序和小端序
- HTTP Keep Alive分析与优化总结
- ggplot2作图详解:映射(mapping)
- jdk,jre,jvm的区别
- Ubuntu 服务器基本配置
- 010Java继承