`
最初永远
  • 浏览: 6247 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Objective-C对象初始化和新特性

阅读更多

 

一。对象初始化

两种创建对象的方法:a.[类名 new];b.[[类名 alloc] init];

这两种方法是等价的,不过通常的Cocoa惯例是使用b方法,而不是用a方法。

1.编写初始化方法

 

 - (id) init{
	/*实例变量所在的内存位置到隐藏的self参数之间的距离是固定的,
	*如果从init方法返回一个新对象,则需要更新self,以便其后的任何实例变量的引用可以被映射到正确的内存位置
	*初始化时init返回值为nil,表明未能初始化对象,那么if方法体内的代码不会执行,
	*像这样将赋值和检查非零值合并起来是一种典型的C风格的方法。
	*/
	if(self = [super init]){
		engine = [Engine new];
		tires[0] = [Tire new]	
	}
	return self;
 }//init

2.清理Car类

 

//使用NSMutableArray来代替Car类中常规的C数组
#import <Cocoa/Cocoa.h>

@class Tire;
@class Engine;
@interface Car:Object{
	NSMultableArray *tires;
	Engine *engine;
}

- (void) setEngine: (Engine *)newEngine;
-(Engine *) engine;

- (void) setTire: (Tire *) tire
	atIndex: (int) index;
- (Tire *) tireAtIndex: (int) index;
- (void) print;
@end //Car
 

同时修改Car类的每一个方法

- (id) init{
	if(self = [super init]){
		tires = [[NSMutableArray alloc] init];
		int i;
		for(i=0;i<4;i++){
			[tires addObject:[NSNull null]];
		}
	}
	return (self);
}
 

创建NSMultableArray,

a.用replaceObjectAtIndex:withObject:代替setTire:atIndex:

(原理是NSMutableArray数组不包含任何内容,使用了NSNull类的对象作为占位符,一般情况下不需要使用NSNull类对象预置NSMutalbeArray数组)

 

- (void) setTire: (Tire *) tire
		atIndex: (int) index
{
	[tires replaceObjecAtIndex: index 
		withObject:tire]	
}//setTire:atIndex: 
 

b.用数组提供的objectAtIndex:方法代替getter方法tireAtIndex:从中获取tire对象

 

- (Tire *) tireAtIndex:(int) index{
	Tire *tire;
	tire = [tires objectAtIndex: index];
	return (tire);
}
 

最后仍要确保对象的清理

 

- (void) dealloc{
	[tire release];
	[engine release];
	[super dealloc];
}//dealloc

3.构造便利初始化函数

 

@interface Tire:NSObject
{
	float pressure;
	float treadDepth;
}
- (id) initWithPressure: (float) pressure
		treadDepth: (float) treadDepth;

- (void) setPressure: (float) pressure;
- (float) pressure;

- (void) setTreadDepth: (float) treadDepth;
- (fload) treadDepth;
@end //Tire
 

初始化函数更易阅读,减少代码量

  - (id) initWithPressure: (float) p

		treadDepth: (float) td{
	if(self = [super init]){
		pressure = p;
		treadDepth = td;
	}		
	return (self);
}//initWithPressure:treadDepth
 

可做如下调用

 

Tire *tire;
tire = [[Tire alloc] initWithPressure: 23
			treadDepth:33];
 

4.当有多个初始化函数时,对子类进行实例化容易发生调用错误,所以需要指定初始化函数,然后在其他的初始化函数中调用指定的初始化函数。

 

- (id) init {
	if (self = [self initWithPressure:34
				treadDepth:20]){
	}
	return (self);
}//init

- (id) initWithPressure: (float) p {
	if(self = [self initWithPressure:p
				treadDepth:20.0]){
	}
	return (self);
}//initWithPressure 
 

二 特性

此Objective-C2.0特性只适用于Mac OS X 10.5(Leopard)或更高版本。

1.简化接口

 

#import <Foundation/Foundation.h>
#import "Tire.h"
@interface Tire:NSObject
{
	float pressure;
	float treadDepth;
}
- (void) setPressure: (float) pressure;
- (float) pressure;

- (void) setTreadDepth: (float) treadDepth;
- (fload) treadDepth;
@end //Tire
 

简化如下#import <Foundation/Foundation.h>

#import "Tire.h"
@interface Tire:NSObject
{
	float pressure;
	float treadDepth;
}
@property float pressure;
@property float treadDepth;
@end // Tire;
 

@property预编译指令的作用是自动声明属性的setter和getter方法。

 

2.简化实现

 

@impletation Tire
- (void) setPressure: (float) p{
	pressure = p;
}//setPressure
- (void) pressure{
	return (pressure);
}//setPressure
@end //Tire
简化如下
@impletation Tire
@synthesize pressure;
@end //Tire

 

@synthesize也是一种新的编译器功能,表示"创建该属性的访问器"。

 

3.特性扩展

a.读写特性(生成setter和getter方法)

 

@property (readwrite,copy) NSString *name;
@property (readwrite,retain) Engine *engine;

b.只读特性(getter方法)

 

@property (readonly) float size;
分享到:
评论

相关推荐

    Object C扫描版PDF

    - **初始化方法**:通常有`init`方法,用于初始化对象,子类应覆盖`init`并调用`[super init]`。 - **选择器(Selectors)**:Objective-C中的消息传递使用选择器表示方法名,如`@selector(methodName:)`。 4. **...

    KVO-32.xcodeproj

    **KVO,全称Key-ValueObserving,是Objective-C中的一个特性,用于实现对象属性的监听和响应机制。在iOS开发中,KVO经常被用来实时监控某个对象的属性变化,进而执行相应的操作。** KVO的核心概念是观察者...

    知易 Cocos2D-iPhone 游戏开发教程002

    在开始学习Cocos2D-iPhone游戏开发之前,建议具备一定的Objective-C或Swift编程基础,以及对OpenGL ES的基本了解。此外,熟悉游戏设计原理和游戏开发流程也将有助于更好地理解和应用Cocos2D-iPhone。 ### 场景切换 ...

Global site tag (gtag.js) - Google Analytics