类和方法


1、类和对象的定义 

类,根据汉语意思,我们就知道它表示具有共同特征或者属性的物的一个概括,我们也经常称为种类。在OC同样具有或者说继承了上面的意思。在OC中,我们能看见的、能摸得着的都可以建一个类。类也是我们接下来要说的-对象要创建的前提。 对象,就是我们类的现实个体,即在程序中的表现为,我们能从屏幕上所看的东西。OC中面向对象即直接面对我们的要想移动或者操作的目标,而不是过程化的思维。

 2、类和对象的创立

要完整的创立一个类,那么我们必须有有我们这个类的声明和定义(即实现)。在OC中采用@interface 来声明。例如,声明一个狗这个类。

@interface Dog :NSObject // 狗的成员变量:体重、毛色、吃,跑
{        @public       
 double weight;  
  Color curcolor;
}
- (void)eat;
- (void)run;
@end

为了描述我们这个类的一些属性或者说公共特征。我们就定义了一些变量,例如上图的double weight;”,我们称这些变量为成员变量。为了实现类对象的一些行为,我们也需要在类声明中声明一些可以操作对象的行为的函数,例如上图的- (void)eat;” 在声明了类的行为和属性之后,我们还必须来实现类的行为,例如,

@implementation Dog
- (void)eat  // 狗吃了后的体重
{   
 weight +=1; 
   NSLog(@"狗吃了的体重是%f",weight); // 打印出狗的体重}

- (void)run // 狗跑了后的体重
{  
  weight -= 1 ;  
      NSLog(@"狗体重是%f",weight); // 打印出狗的体重  
  }
@end

大括号里就是对方法的实现。

 类创建好了之后,我们在运用过程中,就可以根据类的属性创建一个实在的对象;比如 “Dog *d=[dog new]; ” 创建一个具体学生对象这样就把雷和对象都创建好了。

3、方法和成员变量

 方法,即我们的对象的实现方法,它是这个类所有对象都可以使用的行为,只要我们的新对象调用这方法,那么这对象就会做出这个动作,例如,当“d”这个新对象调用”- (void)eat”这个方法,那么它就会执行吃这个动作,结果就是体重增加1.在OC中常这样表示,[d run]。

 成员变量,描述我们类的特性的一些变量,如上面的“double weight;Color curcolor;”,它们是对类的一个描述。当然在创建一个新的对象之后,我们需要给新对象的成员变量赋值。这里的赋值我们一般采用指针(当为公共变量)或者set函数赋值(当为私有或者局部变量),例如,“d->curcolor = ColorGreen; // 给狗一个毛色      d->weight=30// 给狗体重”,”或者   [d setWeight :30]”,或者”d.weight = 30 

4、对象的内存分析

我们建立一个新的对象之后,内存就会留出一块空间来存储这个对象。那么对象内部就会存储这对象的所有属性和方法。当我们定义一个指针P时,内存也会给指针一个空间,这个空间就存储了对象的地址,所以我们利用P来调用对象。实质上,我们在创建新对象之前,内存已经用了一个空间存储了类,而新建好的对象里面默认了一个ISa指针用来存储类的地址(也就是我们说的指向类),但我们用[p  weight]时,它会先到新对象这内存去找weight这以变量,找不到然后顺着指针isa去类这内存去找,最后才才做出这一行为。如下图  

5、注意事项

1)、对象方法参数与函数参数 方法参数的表达:- (void)speedCompareompareWithOther  :(int)other而函数参数的表达式:void  peedCompareompareWithOther (intA,intB)。注意它们的括号,方法里面的小括号只用来括数据类型的,而函数里面的小括号是用来括传入的参数的。

2)、@interface…@end一定一对,成员变量和方法声明一定写在它们之间,方法的实现一定在“@impelementation …@end”之间 3)、成员变量不允许在声明中初始化,要设一个初始值需要写一个方法即,重写init,例如;

Person *d = [[Dog alloc] init];- (id) 
init{
	self = [super init];	
       if (self != nil)	
<span style="white-space:pre">	</span>{	
	<span style="white-space:pre">	</span>weight = 10;	
	};
<span style="white-space:pre">	</span>return self;}

4)、类的设计合理性 

在这个类要用另外一个类的方法的时候,我们要把另外的一个类要写进这个类的属性,这样才能用另外一类的相关方法属性。例如,

@interface Student:NSObject
{
@public   
 Sex sex;
 Date birthday;  
 Color favColor; 
 Dog *dog;    
NSString *name ;
}
- (void)liudog; // 遛狗
- (void)weigou; // 喂狗
- (void)print;
@end

实际上OC会有一个继承和多态来解决这问题。

5)当我们用”[Dog new]->weight = 20”来代替”Dog *d = [Dog mew];d->weight = 20,”时,我们要注意,再次[Dog new]->weight = 50这样赋值之后那么weight的值会变为50,而不会再说20。这种写法会导致第一个[Dog new]一直在内存中占用内存,是内存的利用率降低,因此实际项目中,不会这样写,要写成Dog *d = [Dog mew];d->weight = 20”。

最后加一个类和对象的一个程序(文中节选的程序片段出之于此程序)


#import <Foundation/Foundation.h>
// 定义一个关于性别的枚举类型
Sextypedef enum {    
SexMan, // 男性   
 SexWoman // 女性
} Sex;
//定义一个关于日期的结构体类型
typedef struct { 
   int year; // 年
    int mouth; // 月
    int day; // 日
} Date;
// 定义一个关于颜色的枚举类型
typedef enum {
    ColorBlack, // 黑色
    ColorRed, // 红色
    ColorGreen // 绿色
} Color;
/* 学生 成员变量:性别、生日、狗的重量、狗的毛色、狗 方法:吃、跑步、遛狗、喂狗 */
@interface Dog :NSObject // 狗的成员变量:体重、毛色、吃,跑
{        @public 
       double weight;    
<span style="white-space:pre">	</span>Color curcolor;}
- (void)eat;
- (void)run;//keyi加;
-(void)dealloc;
/* 可以写成: @property(nonatoimc , assign) double weight  @property(nonatoimc , assign) color curcolor   */
@end
// 狗的方法的实现
@implementation Dog- (void)eat // 狗吃了后的体重
   weight +=1;
    NSLog(@"狗吃了的体重是%f",weight); // 打印出狗的体重
}
- (void)run // 狗跑了后的体重
{
    weight -= 1 ; 
       NSLog(@"狗体重是%f",weight); // 打印出狗的体重   
 }
/*
-(void)dealloc  //内存管理的
 {
 [self release];
 [super dealloc];
 }
 */
@end
//学生的类的建立,对象属性,性别,生日,喜欢的颜色,姓名,他的狗,遛狗。喂狗
#import<Foundation/Foundation>
#import "Dog.h"
@interface Student:NSObject
{
@public 
   Sex sex;
    Date birthday; 
   Color favColor;
    Dog *dog; 
   NSString *name ;
}
/*  内存管理写法 
@property(nonatomic,assign) Sex sex 
 @property(nonatomic,assign) Date birthday 
 @property(nonatomic,assign) char *name 
 @property(nonatomic,asign) Color favcolor
  @property(nonatomic,retain) Dog *dog
 */
 - (void)liudog; // 遛狗
 - (void)weigou; // 喂狗
 - (void)print;@end
// 人的方法实现
@implementation Student
- (void)print
{   
 NSLog(@"姓名%@,性别%d,喜欢的颜色%d,生日%d-%d-%d",name,sex,favColor,birthday.year,birthday.mouth,birthday.day);
}
// 遛狗的方法实现
- (void)liudog
{
        [dog run];
}
// 喂狗的方法实现
- (void)weigou
{    
[dog eat];
}
/*-(void)dealloc  //内存管理的
[self release]; 
[super dealloc];
*/
@endint main()
      Student *s=[Student new]; // 创建一个具体学生对象 
       Dog *d =[Dog new]; // 创建一个具体的DOg对象
    s->favColor = ColorGreen;
    d->curcolor = ColorGreen; // 给狗一个毛色
        d->weight=30; // 给狗体重
        s->name = @"jonk";
    s->dog = d; // 最重要的,把狗给一个特定的人
        s->sex = SexMan; // 给学生定义性别
        Date date = {1990,8,26};
    s->birthday = date; // 给学生定义生日 
       [s liudog];// 遛狗 
       [s weigou]; // 喂狗
        [s print];
        return 0 ;
    }
/* 由于内存管理的原因还可以这么写
 int main() 
<span style="white-space:pre">		</span>@autoreleasepool { 
<span style="white-space:pre">	</span>Student *s = [[Student alloc] autorelease];
<span style="white-space:pre">	</span> Dog *d = [[Dog alloc] autorelease];<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span> d.curcolor = colorGreen; 
<span style="white-space:pre">	</span> d.weight = 30; 
<span style="white-space:pre">	</span> s.dog = d; 
<span style="white-space:pre">	</span> s.sex = SexMan;
<span style="white-space:pre">	</span>  Date d = {1990,8,26};
<span style="white-space:pre">	</span>  s.birthday = d;
<span style="white-space:pre">	</span>  [s print];
<span style="white-space:pre">	</span> return 0;
 }
*/

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值