`
sarin
  • 浏览: 1757000 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173669
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368140
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189271
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99845
社区版块
存档分类
最新评论

Objective-C学习笔记七:类的定义一

阅读更多
    接上文
    我们还是结合之前分数的示例来说明,只是更为详尽。使用XCode创建新的项目Fraction,然后创建Fraction类,此时XCode为我们生成两个文件:Fraction.h和Fraction.m。我们在Fraction.h这个头文件中定义分数类Fraction,在Fraction.m中编写分数类的实现代码,在main.m中编写测试程序。那么在XCode中我们得到如下的项目结构:



    来看下头文件中的类定义:
//
//  Fraction.h
//  Fraction
//
//  Created by Nan Lei on 13-1-1.
//  Copyright (c) 2013年 Nan Lei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
-(double) convertToNum;

@end

    这里的头文件也可以叫做接口文件,它会告知编译器Fraction类的特征,就是包含六个实例方法(用"-"定义的方法)。Fraction类的实现会编写在Fraction.m文件中,代码如下:
//
//  Fraction.m
//  Fraction
//
//  Created by Nan Lei on 13-1-1.
//  Copyright (c) 2013年 Nan Lei. All rights reserved.
//

#import "Fraction.h"

@implementation Fraction
{
    int numerator;
    int denominator;
}

-(void) print
{
    NSLog(@"%i/%i",numerator,denominator);
}

-(void) setNumerator:(int)n
{
    numerator=n;
}

-(void) setDenominator:(int)d
{
    denominator=d;
}

-(int) numerator
{
    return numerator;
}

-(int) denominator
{
    return denominator;
}

-(double) convertToNum
{
    if(denominator!=0){
        return (double)numerator/denominator;
    }else{
        return NAN;
    }
}

@end

    这和我们之前示例中的是一样的,这里注意一点import语句,我们使用双引号("")来导入头文件,而不是尖括号(<>),原因是Fraction.h是我们自定义的头文件,而不是系统提供的。这样编译器就知道该从什么地方来找到指定的头文件,当然,如果有必要,可以使用更为详细的路径(当我们在不同包下定义了相同的类名的类时)来查找不同位置。
    最后来看main.m文件,这是我们之前没有做的一个文件,此时我们拆分main函数到main.m文件中,代码如下:
//
//  main.m
//  Fraction
//
//  Created by Nan Lei on 13-1-1.
//  Copyright (c) 2013年 Nan Lei. All rights reserved.
//

#import "Fraction.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Fraction *fractionA = [Fraction new];
        Fraction *fractionB = [Fraction new];
        
        [fractionA setNumerator:1];
        [fractionA setDenominator:3];
        
        NSLog(@"The value of fractionA is %g",[fractionA convertToNum]);
        
        NSLog(@"fractionB is %i / %i",fractionB.numerator,fractionB.denominator);
        NSLog(@"The value of fractionB is %g",[fractionB convertToNum]);
    }
    return 0;
}

    要注意这里的import语句,我们仍然引入的是头文件,而不是实现文件。也就是我们只需获取类定义部分的信息就可以了,系统处理时会为我们寻找实现的方法。
    这样的代码结构对于之前看到的简单示例来说就复杂多了,这是我们扩大程序规模的必经之路,也更为实用。
    我们在上述代码中的Fraction实现文件中编写了两个属性numerator和denominator,并且提供了设置值和取值的方法(类似Java的getter和setter方法),其实更好的写法是在接口文件中使用@property指令来定义属性,还可以省略掉设置值和取值的方法(系统会自动为我们实现),那么Fraction.h的代码修改如下:
#import <Foundation/Foundation.h>


@interface Fraction : NSObject

@property int numerator,denominator;

-(void) print;
-(double) convertToNum;

@end

    这样一来,代码就简单很多,那么在实现文件Fraction.m中使用@synthesize指令即可完成对属性numerator和denominator的设置值和取值操作:
#import "Fraction.h"

@implementation Fraction

@synthesize numerator,denominator;

-(void) print
{
    NSLog(@"%i/%i",numerator,denominator);
}

-(double) convertToNum
{
    if(denominator!=0){
        return (double)numerator/denominator;
    }else{
        return NAN;
    }
}

@end

    在XCode中运行代码,我们就得到如下的结果:



    说明我们的代码是正确的。
    我们使用了@property指令,就不用在实现部分定义相应的实例变量,使用@synthesize指令就会告诉编译器为我们生成设置值和取值的方法。方法命名规范是设置值方法setX(x是我们的变量名),注意大小写(和Java Bean的访问器方法类似),取值方法名就是变量名x。当然我们也可以使用点运算符来访问属性,比如我们代码中的写法。同时使用点运算符来为属性赋值也是可以的,只是在代码中没有体现出来。
    比如instance.property=value等价于[instance setProperty: value],比如instance.property等价于[instance property]的写法。
    之前的代码中我们的方法参数都为一个,下面来看看带有多个参数的方法该如何定义和使用。我们继续来改写分数类Fraction,提供一个可以同时设置分子和分母的方法,很容易想到如下语句[fractionA setNumerator:1 setDenominator:3],这是我们很容易想到的方式,但是该方式不具备一个易于理解的方法名,其实我们可以这样来定义这个方法:
  
 -(void) setTo: (int) n over: (int) d;

   下面修改头文件的定义,代码如下:
#import <Foundation/Foundation.h>

@interface Fraction : NSObject

@property int numerator,denominator;

-(void) print;
-(double) convertToNum;
-(void) setTo:(int) n over: (int) d;

@end

    这里我们加入了这个方法的定义,那么实现该方法,代码如下:
#import "Fraction.h"

@implementation Fraction

@synthesize numerator,denominator;

-(void) print
{
    NSLog(@"%i/%i",numerator,denominator);
}

-(double) convertToNum
{
    if(denominator!=0){
        return (double)numerator/denominator;
    }else{
        return NAN;
    }
}

-(void) setTo:(int)n over:(int)d
{
    numerator=n;
    denominator=d;
}

@end

    最后修改主函数来进行测试:
#import "Fraction.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Fraction *fractionA = [Fraction new];
        Fraction *fractionB = [Fraction new];
        
        [fractionA setTo:10 over:406];
        [fractionB setTo:23 over:901];
        
        [fractionA print];
        [fractionB print];
    }
    return 0;
}

    编译运行,我们得到如下的结果:



    带有多个参数的方法在定义时,参数名称是可选的,比如上面的方法我们还可以定义为如下形式:-(int) set: (int) n: (int) d;显然这里没有对第二个参数命名,那么调用该方法时,我们可以这样做[fractionA set: 10: 406],虽然可以这么做,但是省略参数名的做法是不推荐的,因为可能会引起语义不清等问题。如果参数很多或者参数很重要,可能就会引起大问题。
    接下文
  • 大小: 20.9 KB
  • 大小: 82.7 KB
  • 大小: 61.1 KB
3
2
分享到:
评论
3 楼 itfanr 2015-01-24  
写的很好  收--藏了  平时翻来看看
2 楼 sarin 2013-01-05  
zwlfyl 写道
很不错的文章,由浅入深,就是更新有点慢,谢谢

呵呵,其实我也想快。但是目前ITEYE风气很不好。为了能让更多人看到而不被恶意踩掉,那么我只能拉长时间。
1 楼 zwlfyl 2013-01-05  
很不错的文章,由浅入深,就是更新有点慢,谢谢

相关推荐

    Objective-c学习笔记

    8. **类的结构**:一个Objective-C类通常包含接口(.h文件)和实现(.m文件)。接口文件声明实例变量和公共方法,实现文件包含实际的代码实现,并可能包含私有方法。 9. **方法命名**:Objective-C方法名通常省略...

    objective-c学习笔记

    这篇“Objective-C学习笔记”旨在帮助初学者理解并掌握这种强大的编程工具。 一、Objective-C基础 1. 类与对象:Objective-C中的所有操作都是基于类的,类是对象的模板,而对象是类的实例。理解类和对象的概念是...

    Objective-C 基础语法学习项目

    根据给定的学习笔记,我们将从以下几个方面深入探讨Objective-C的基础语法: 1. **基本概念介绍**:包括类、对象、方法等基本概念。 2. **Objective-C核心类型**:如`NSString`、`NSArray`、`NSDictionary`。 3. **...

    Objective-C 学习笔记

    Objective-C 是一种面向对象的编程语言,起源于20世纪80年代,由Bard Cox发明,后来在NeXTSTEP操作系统中得到广泛应用。NeXT公司由Steve Jobs创立,并在1996年被苹果公司收购,Objective-C也随之成为苹果操作系统的...

    Objective-C学习笔记(一)OC基础.md

    这篇笔记主要介绍了Objective-C的一些基础知识,包括以下几个方面: 1. Objective-C概述,介绍了Objective-C的来源、发展历史和作为面向对象的C语言的特点。 2. 第一个OC程序,讲解了如何创建一个OC项目,解释了一些OC...

    Objective-C学习资料(内置学习笔记,各内容源码)

    这份“Objective-C学习资料”包含了内置的学习笔记和各内容源码,是作者在近两个月的学习过程中整理出来的成果,旨在为初学者提供有价值的指导。 首先,让我们深入了解一下Objective-C的基本概念。Objective-C是在...

    objective-c编程入门学习笔记

    Objective-C中定义一个类通常包括两个文件:头文件(`.h`)和实现文件(`.m`)。头文件包含了类的接口声明,而实现文件包含了类的方法实现。 - **头文件**:定义了类的公共接口,其他类可以通过这个接口来访问这个...

    Objective-C&UIKit自学笔记

    Objective-C是一种面向对象的编程语言,它在C语言的基础上增加了SmallTalk-80的特性,主要应用于Apple的iOS和macOS平台。Objective-C中的UIKit框架是构建用户界面的基础,提供了丰富的控件和功能来创建iOS应用程序。...

    Objective-C基础教程第二版

    **Objective-C**是一种面向对象的编程语言,它在C语言的基础上增加了面向对象的功能,并且是开发iOS应用的主要语言之一。尽管Swift已经成为苹果官方推荐的新一代编程语言,但Objective-C仍然拥有大量的代码库和丰富...

    Mac编程入门资料(Objective-C)

    Objective-C是一种基于C语言的面向对象编程语言,主要应用于Apple的macOS和iOS操作系统。它是开发Mac应用程序的基础,对于想要进入苹果平台开发的程序员来说,学习Objective-C是必不可少的步骤。本资源包为初学者...

    objective c学习笔记

    Objective-C是一种简单的...Objective-C通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的ANSI C语言。类的语法和设计主要是基于Smalltalk,最早的面向对象编程语言之一。

    Objective-C

    Objective-C是在C语言的基础上扩展的,增加了Smalltalk式的面向对象特性,使得它在编写复杂应用程序时具有更高的灵活性和可扩展性。 Objective-C的核心概念主要包括类、对象、消息传递和协议。以下是对这些概念的...

    Object-C 学习笔记

    Objective-C(简称Obj-C或Objective C)是苹果公司基于C语言开发的一种面向对象编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,使得面向对象编程更加灵活...

    objective-c的总结

    类是Objective-C中的基本构建块,它定义了一组相关的属性(数据)和方法(行为)。你可以通过继承来创建新的类,从而复用现有类的属性和方法。Objective-C支持多继承,但通常建议使用协议(Protocols)来实现类似的...

    object-c学习笔记

    这篇学习笔记主要涉及了Objective-C的基础知识,包括对象创建、类的结构、文件导入、实例变量、接口与实现、内存管理和属性。 1. **对象创建**: - `string`方法创建的字符串对象是自动释放的,意味着系统会在适当...

    iphone OBJ-C入门笔记

    Objective-C 的核心概念之一是类(Class)。类的定义通常包含两个文件:头文件(.h)和源文件(.m)。头文件用于声明类的接口,包括其属性(成员变量)和方法,而源文件则实现这些接口。这与 C++ 的组织方式类似,...

    Objective-C的入门学习笔记

    Objective-C 是苹果平台下开发 iOS 和 macOS 应用的主要编程语言之一,虽然 Swift 已经成为新宠,但Objective-C 的重要性仍然不可忽视,尤其是因为许多现有的类库和框架仍由 Objective-C 编写。以下是一份关于...

    Object-C语言教程0220.zip基础知识及相关案例

    首先,Objective-C是Apple公司基于C语言构建的一种面向对象的编程语言,它在C语言的基础上添加了Smalltalk风格的消息传递机制,以及一些类和对象的概念。Objective-C是iOS和macOS应用开发的首选语言,其强大的特性...

Global site tag (gtag.js) - Google Analytics