您的位置:首页 > 移动开发 > IOS开发

自学iOS开发系列----OC(类和对象)

2016-11-21 13:30 363 查看
学习一门新的语言跟玩一个新游戏差不多,下载游戏(开发工具),熟悉游戏规则(了解开发工具如何使用),看解说视频(看书籍,博客,开发视频),自己多玩几次(多练习敲代码),慢慢的就入门,然后掌握,然后精通。

OC阶段我计划用11个篇幅来概述:类和对象、字符串、数组、字典、点语法、继承和类别、文件操作、JSON解析、内存管理、协议代理、Blocks。

开篇之前再次重申一遍,本系列以实战为主,理论为辅,目的是帮助小白快速入门。

1.OC是一门用于编写iOS和OS X的面向对象语言。OC是C语言的超集,OC完全兼容C。

2.C语言中用#include导入头文件,OC中用#import导入头文件可以防止重复导入

3.类命名规范:首字母大写,遵循波浪原则,驼峰原则,之后的每个单词首字母均大写:FirstClass

4.面向过程和面向对象概念解析

【面向过程】直接和CPU交流,关注的主要是数据,存储数据和操作数据,侧重数学逻辑。

案例:公园周长500米,有个美女,速度为100m/min,这个美女跑多长时间能跑完这段路?

路程/速度

【面向对象】添加一个能够接受信息的单元(对象),每个单元拥有自己的功能,各个单元合作,完成程序,侧重生活逻辑。

案例:公园周长500米,有个美女,速度为100m/min,这个美女跑多长时间能跑完这段路?

此案例有两个对象:公园和美女

5.类和对象的定义

类:同一个类型的对象的抽象

对象:类的具体形式

类: 水果 蔬菜

对象: 苹果、梨、香蕉 西红柿、冬瓜、白菜

6.类方法和对象方法

“+”表示这个方法是一个类方法,调用的时候需要使用类来调用

“-“ 表示这个方法是一个对象(成员)方法,调用的时候需要使用类的对象来调用

7.类方法的特点

①类方法不能使用成员变量

②可以和成员方法同名,并且调用的时候互不干扰。

③类方法中不能直接调用成员方法

8.类方法的作用

①使用类方法可以用来创建类的对象

②快速的调用类里面的方法(单例)

9.创建一个简单类

①新建一个项目(参照Xcode使用

②command+N选择Cocoa Touch Class



③为新建类命名Dog



④创建类成功,生成.h和.m文件,.h文件用作声明,.m文件主要用作实现(OC阶段暂时用不到AppDelegate和ViewController,故暂不需要做深入研究和讲解)



10.创建一个对象

在main.m中导入头文件#import “Dog.h”

Dog为类,dog为对象



Dog.h文件

#import <Foundation/Foundation.h>

//类的声明
@interface Dog : NSObject {

//成员变量
int _age;
int _weight;
}

+ (Dog *)defaultDog;    //类方法

- (void)sleeping;       //对象(成员)方法

+ (void)sleeping;       //成员方法和类方法可以同名

@end


Dog.m文件

#import "Dog.h"

static Dog * wangwang = nil;

//类的实现
@implementation Dog

//单例
+ (Dog *)defaultDog {

if (wangwang == nil) {
wangwang = [[Dog alloc] init];
}

return wangwang;
}

- (void)sleeping {
_name = @"wangwang";
NSLog(@"这是一个成员方法");
}

+ (void)sleeping {
//类方法不能使用成员变量,成员方法也不能直接调用
Dog * dog2 = [[Dog alloc] init];
[dog2 sleeping];
NSLog(@"这是一个类方法");
}

@end


main.m文件

#import <Foundation/Foundation.h>

#import "Dog.h"

//导入的时候 都是选择.h文件 禁止导入.m
int main(int argc, const char * argv[]) {

@autoreleasepool {

//父类已实现的方法 子类都可以直接用
Dog * dog1 = [[Dog alloc] init];
[dog1 sleeping];

//使用类名调用类方法,类方法没有空间
[Dog sleeping];

//单例
[[Dog defaultDog] sleeping];

}

return 0;
}


【注】单例是一种设计模式,它确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。

static Dog * wangwang = nil;

+ (Dog *)defaultDog {

if (wangwang == nil) {
wangwang = [[Dog alloc] init];
}

return wangwang;

}


10.类的复合

一条公路,长度是300Km,有一个小汽车,速度为50Km/h,这个小汽车跑多长时间跑完这段路。

①新建一个Road类

Road.h文件

#import <Foundation/Foundation.h>

@interface Road : NSObject {

int _length; //公路长度

}

//设置长度
- (void)setLength:(int)length;

- (int)length;

@end


Road.m文件

#import "Road.h"

@implementation Road

- (void)setLength:(int)length {
_length = length;
}

- (int)length {
return _length;
}

@end


②新建Card类

Card.h文件,导入#import “Road.h”

#import <Foundation/Foundation.h>

#import "Road.h"

@interface Car : NSObject {

int _speed; //速度

}

//设置速度
- (void)setSpeed:(int)speed;

- (void)runOnRoad:(Road *)road;

@end


Card.m文件

#import "Car.h"

@imp
c583
lementation Car

- (void)setSpeed:(int)speed {
_speed = speed;
}

- (void)runOnRoad:(Road *)road {
int roadLength = [road length]; //路程
NSLog(@"需要时间为:%dh",roadLength/_speed);
}

@end


main.m文件

在main.m文件导入头文件#import “Car.h”和#import “Road.h”

#import <Foundation/Foundation.h>

#import "Car.h"
#import "Road.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

Road * road = [[Road alloc] init];

[road setLength:300];

Car * car = [[Car alloc] init];

[car setSpeed:50];

//让车跑在路上,看需要多少时间
[car runOnRoad:road];

}

return 0;

}


小练习:创建两个立方体,长宽高分别为4,5,6和7,8,9,问两个立方体的体积是多少?

参考答案(一万个读者有一万个哈姆雷特,一万个程序员有一万种编码风格,答案仅供参考)

Cube.h文件

@interface Cube : NSObject {

int _length;

int _wide;

int _height;

}

-(void)setLength:(int)length;

-(void)setWide:(int)wide;

-(void)setHeight:(int)height;

-(int)getArea;

@end


Cube.m文件

@implementation Cube

-(void)setLength:(int)length {
_length=length;
}

-(void)setWide:(int)wide {
_wide=wide;
}

-(void)setHeight:(int)height {
_height=height;
}

-(int)getArea {
return _length*_wide*_height;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  开发工具 对象