关闭

【iOS开发之Objective-C】复合

标签: objective-c复合descriptionsuperinit
614人阅读 评论(0) 收藏 举报
分类:

上一篇继承里面我们说OOP里面的两个方面,一个是继承,那么另一个就是复合。

1.什么是复合

只有对象的组合才叫做复合。在Objective-C中,复合是通过包含作为实例变量的对象指针实现的。

2.复合的一个简单实例

例如:一辆汽车有6块玻璃、4个轮胎和1个发动机组成;

首先我们新建三个对象,分别是玻璃Glass、轮胎Tire和发动机Engine;

其次我们新建一个车Car对象;

关于Xcod中怎么新建对象,请看我的上一篇《【IOS开发之Objective-C】继承》里面有详细操作说明。

最后我们在Car对象中将玻璃Glass、车轮Tire和发动机Engine三个对象组合在一起。

具体实现:

//
//  Glass.h
//  基本的复合
//
//  Created by qf on 15-7-11.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Glass : NSObject

@end
#import "Glass.h"

@implementation Glass

- (NSString *)description
{
	return (@"A car has six glass.");
}

@end

//
//  Tire.h
//  基本的复合
//
//  Created by qf on 15-7-11.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Tire : NSObject

@end
#import "Tire.h"

@implementation Tire

- (NSString *)description
{
	return (@"A car has foue tires.");
}

@end
//
//  Engine.h
//  基本的复合
//
//  Created by qf on 15-7-11.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Engine : NSObject

@end
#import "Engine.h"

@implementation Engine
- (NSString *)description
{
	return (@"A car has one engine.");
}
@end
我们可以看见三个类都是基于NSObject类的。表明每个类都是一个NSObjec,并且每个类都将继承NSObject类定义的所有行为。

下面再来看看类是怎么复合的。

//
//  Car.h
//  基本的复合
//
//  Created by qf on 15-7-11.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Glass.h"
#import "Tire.h"
#import "Engine.h"    
@interface Car : NSObject
{
	Glass  *glass;
	Tire   *tire;
	Engine *engine;
}
- (void) print;
@end
#import "Car.h"

@implementation Car
- (id) init
{
	if(self = [super init])
	{
		glass  = [Glass new];
		engine = [Engine new];
		tire   = [Tire new];
	}
	return (self);
}
- (void) print
{
	NSLog(@"%@",glass);
	NSLog(@"%@",engine);
	NSLog(@"%@",tire);
}
@end
我们再来仔细看看Car对象的复合部分,是不是有点像C语言里面:我们先写Glass.c和Glass.h,Tire.c和Tire.h ……一直到把Car的写完,最后我们在Car.h里面包含其他三个.h头文件,最后我们就可以在car.c里面调用其他三个里面的函数了。

在车子的三个部分的类中,我们都可以看见一个description。

可以看见在函数:

- (NSString *)description
{
	return (@"A car has one engine.");
}
返回的是一个NSString的指针,指针内容是:A car has one engine.其他两个也是一样的。

在三个类的复合部分,我们就能看见在Objective-C中,复合是通过包含作为实例变量的对象指针实现的。

这句话到底是怎么样的。

@interface Car : NSObject
{
	Glass  *glass;
	Tire   *tire;
	Engine *engine;
}
每一个Car对象都会为glass、tire和engine的指针分配内存,但真正包含在Car中的并不是glass、tire和engine变量,只是内存中存在的其他对象的指针。为新建的Car对象分配内存是,这些指针都将被初始化为nil(零值)。

3.Car类是怎么实现的呢?

首先是初始化实例变量的init方法。该方法为我们的汽车创建了6个玻璃glass、4个轮胎和1个发动机变量。使用new创建新对象时,系统其实在后台执行了两步操作:第一步,为对象分配内存,即对象获得一个用来存放实例变量的内存块;第二步,自动调用init方法,是对象进入可使用状态。

在init方法中,有这么一个语句:

if(self = [super init])

为了让超类NSObject将初始化工作一部完成,需要调用[super init]。init方法返回值id类型数据,即泛型对象指针,就是被初始化的对象。将[super init]返回的结果赋给self是Objective-C的惯例。这么做是为了防止超类在初始化过程中返回对象与一开始创建的不一致。

再来看看main函数里面的。

//
//  main.m
//  基本的复合
//
//  Created by qf on 15-7-11.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc, const char * argv[]) {
	@autoreleasepool {
	    Car *car;         //创建一个Car类型的指针car
	    car = [Car new];  //为car新建一个对象
	    [car print];      //调用print函数 打印输出
	    NSLog(@"Hello, World!");  
	}
    return 0;
}
main函数里面就比较简单了,看注释。

4总结

起初在看见俺这些代码的时候觉得很像C语言里面的一样,写几个.h和.c文件,让后就可以相互调用了。但这么其实和C语言里面的不一样。不然怎么会叫复合呢?呵呵,其实我也还不太懂。

我们需要学习descrption、super、init的使用。

最后还需要大量的联系其体会和理解什么是复合。

0
0
查看评论

IOS开发之路-Objective-C 复合

今天先补充一下很有必要记住的东西. objective-c 格式化输出符号 %@     对象 %d, %i 整数 %u     无符整形 %f     浮点/双字 %x, %X 二进制整数 %o ...
  • joyoing
  • joyoing
  • 2013-08-01 18:35
  • 735

objective-c之复合对象

#import //自定义验证表数组ValidatingArray @interface ValidatingArray : NSMutableArray { NSMutableArray *embeddedArray; } + validatingArray; - init; - (...
  • earbao
  • earbao
  • 2016-08-03 16:20
  • 394

objective-c 复合

编程中的复合就像音乐中的作曲一样:将多个组件组合在一起配合使用 从而得到完美的作品(程序中的复合其实就是类中包含类) 来了:在软件开发过程中,程序员可能会使用一个Pedal(脚踏板/脚蹬子) 对象和一个Tire(车轮)对象组合出虚拟的独轮车。 @interface Unicycle:NSOb...
  • pzw0416
  • pzw0416
  • 2012-02-14 13:22
  • 535

ios开发 网络编程HTTP/FTP连接

1.CFHTTP    可以使用CFHTTP API创建HTTP请求,通常HTTP请求方法包括GET、HEAD、PUT、POST、DELETE、TRACR、CONNECT和OPTIONS。使用CFHTTP请求一般4个步骤:    使用CFHTTPM...
  • u012894479
  • u012894479
  • 2014-04-16 11:09
  • 995

Objective-C代码块Block详解

block代码块是OC的一个特性,除了可执行的代码外,还可能包含变量的自动绑定(栈),或内存托管(堆)。所以一个block维护一个状态集(数据),可以在任何时候执行。block用来作为回调特别有用。     block可以作为函数参数或者函数的返回值,而本身又可以带输入...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2015-10-25 19:41
  • 2452

ios开发-Objective-C之内存管理机制

1.概述 作为一个开发者我们都明白在程序运行的过程中要去创建大量的对象,和C语言/JAVA类似,在OC中创建对象的时候,它是存储在堆中的(eg-1.1),系统并不会自动释放内存的,(这里要注意基本类型都是放在栈中的,它由系统自己管理);如果一个对象被创建了不能及时的去释放它所占用的内存或者出现内存泄...
  • bestoneToo
  • bestoneToo
  • 2015-10-31 16:04
  • 226

【iOS开发之Objective-C】继承

继承 1.什么是继承 编写面向对象的程序时,你所创建的类和对象之间存在一定的关系。它们协同工作才能使程序实现功能。 处理类和对象的关系时,尤其要重视OOP的两个方面。第一个方面是继承(inheritance)。创新一个新类时,通常要根据它与现有类的区别来定义。使用继承可以定义一个具体的父类所有功能的...
  • zhuming3834
  • zhuming3834
  • 2015-07-05 10:00
  • 461

《iOS开发之美》学习笔记

学习资料: iOS开发之美 和凌志著 版次:2014年11月第1版 第1篇 Objective-C语法篇 第1章 iOS开发环境的搭建 第2章 Objective-C编程语言特性 第2篇 Storyboard技术篇 第3章 iOS常用的开发控件 UIButton、UILabel ...
  • desirelll
  • desirelll
  • 2016-04-23 19:04
  • 237

iOS开发--Objective-C之KVC

首先来了解一下什么KVC,KVC就是我们平时所说的键值编码,简单的理解就是可以通过一个key值,修改对象的与这个key对应属性的值,也可以根据该key获取对象的与这个key相对应属性的值。 KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议,也就是说Ob...
  • u013794726
  • u013794726
  • 2015-06-14 22:07
  • 288

iOS中定时器NSTimer使用

调用一次计时器方法: [cpp] view plaincopy myTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self&#...
  • freedom2028
  • freedom2028
  • 2013-09-11 19:52
  • 38507
    个人资料
    • 访问:520179次
    • 积分:7033
    • 等级:
    • 排名:第3897名
    • 原创:188篇
    • 转载:0篇
    • 译文:0篇
    • 评论:172条
    博客专栏
    最新评论