一。对象初始化
两种创建对象的方法: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;
分享到:
相关推荐
Objective-C语言入门教程&深入浅出,理论实践相结合 Objective-C语言入门教程&深入浅出,理论实践相结合 Objective-C语言入门教程&深入浅出,理论实践相结合 Objective-C语言入门教程&深入浅出,理论实践相结合 ...
4. 构造器(Constructors):Objective-C中的构造器用于初始化对象实例。虽然语言本身不直接支持构造器,但通常在类的实现部分使用特定的方法来模拟构造器的功能。 5. 类级别的访问控制(Classlevel access):...
Objective-C是在C语言基础上扩展的,引入了Smalltalk的面向对象特性,如消息传递机制,使得代码更加灵活和可扩展。 "第二讲 数据类型、运算符和表达式"深入讲解了基本的数据类型,包括整型、浮点型、字符型等,以及...
1. **通过Objective-C源代码**:这是最常见的交互方式,当编写和编译Objective-C类和方法时,编译器会自动生成一些数据结构和函数,用于支持语言的动态特性。这些数据结构包含了类定义和协议定义中的信息,如方法...
书中还可能涵盖Block(代码块)的使用,这是Objective-C中一种强大的语法特性,常用于多线程和异步编程,因为它可以捕获和封装变量的上下文。另外,可能会讲解到Cocoa Touch和Cocoa框架中的线程安全类和方法,以及...
Objective-C语言的许多决策可以在编译和运行时执行。只要有可能,它是动态的。这意味着Objective-C语言不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。Runtime系统是一种用于Objective-C语言的操作系统...
Objective-C添加了消息传递机制、类和协议等面向对象特性。 2. **消息传递**:Objective-C中的对象通过发送消息来交互。消息传递是Objective-C的核心概念,它类似于其他语言中的方法调用,但更灵活,因为可以动态...
接下来,您可以开始探索Objective-C的各种特性和功能,逐步深入学习和开发iOS应用程序了。希望这份指南能够帮助您顺利入门,祝您学习进步! 总结来说,在Windows系统下搭建Objective-C开发环境虽然不像在Mac OS X上...
4. **面向对象编程**:C++的面向对象特性,如封装、继承和多态,可以增强Objective-C的编程能力。 ### 混用示例 在Objective-C++项目中,你可能会看到类似这样的代码: ```objc // Objective-C部分 @interface ...
类方法通常用于初始化类或提供类级别的操作,而实例方法处理特定对象的操作。 6. categories:Objective-C的类别机制允许向已存在的类添加新的方法,而无需修改原有代码,这是Objective-C的一个强大特性。 7. ...
1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,因此它包含了C的所有特性。书中会讲解基本的数据类型、控制结构、函数和指针等基础知识,同时介绍Objective-C特有的动态类型和消息传递机制。 2. **...
在掌握了这些C语言基础知识后,你将更好地理解和学习Objective-C,因为Objective-C是在C语言的基础上扩展的面向对象编程语言,它保留了C的大部分语法,并引入了类、消息传递等面向对象特性。因此,牢固的C语言基础...
Objective-C语言是一种面向对象的编程语言,它是C语言的一个超集,专门为MacOSX和iOS平台的开发设计。作为苹果官方支持的语言,Objective-C拥有悠久的历史和深厚的技术底蕴。它从C语言发展而来,对C语言的结构和语法...
通过学习Objective-C的基本语法、类和对象、控制流程和方法等内容,你将能够编写简单的Objective-C程序并逐渐掌握更复杂的概念。继续学习和实践,你将能够开发各种类型的应用程序,并为用户提供出色的体验。祝你在...
《Objective-C基础教程》是一本面向初学者的编程书籍,主要涵盖了Objective-C语言的基本概念、语法和编程实践,尤其适合那些想要踏入iOS应用开发领域的学习者。Objective-C是Apple公司开发的面向对象的编程语言,它...
Objective-C的一个独特特性是类簇(Class Clusters),它允许库定义对象创建的语义,使得当向对象发送`-init`消息时,返回的可能是与原始对象类型不同的初始化对象。这种设计提高了效率,允许不同数据类型的子类提供...
本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等众多重要的面向对象...
1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,添加了面向对象特性。它的基础包括类、对象、消息传递等概念。类定义了对象的属性和行为,对象则是类的实例。消息传递是Objective-C的核心,通过`...
C++程序员会发现Objective-C与C++有显著的不同,尤其是在面向对象特性上。书中的内容可能包括Objective-C的动态特性,如运行时类型信息和消息转发,这些都是C++所缺乏的。此外,可能会对比两种语言的类系统,解释...
适合人群:对面向对象编程和iOS/macOS开发感兴趣的开发人员,尤其是希望深入了解Objective-C语言特性的程序员。 使用场景及目标:帮助开发者理解和掌握Objective-C的基本概念和高级特性,提高他们在苹果生态系统的...