首页 > 代码库 > 2014年12月9日星期二 oc学习笔记

2014年12月9日星期二 oc学习笔记

OC的第二个类

Touch第二个类文件.m

Open 第二个类文件.m

/*

类名:Person

属性(成员变量\实例变量):体重、年龄

行为(方法):走路

*/

/*1.类的声明

     *成员变量

     *方法的声明

*/

例一:

#Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”走了一段路”)

}

@end

Int main()

{

         Person*p=[Person new]

P->age=2;

p->weight=50.0;

[P walk];

Return 0;

}

 

 

例二:

#Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”%i岁、%f公斤的人走了一段路ageweight)

}

@end

Int main()

{

         Person*p=[Person new]

P->age=2;

p->weight=50.0;

[P walk];

 

Person *p2=[Personnew]

P2->age=30;

P2->weight=60.0;

[P2 walk];

 

return 0;

}

                            wKiom1SHEKvBbQRMAAFag3Cuq1Q511.jpg

例三:

#Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”%i岁、%f公斤的人走了一段路ageweight)

}

@end

Int main()

{

         Person*p=[Person new];

         p->age=20;

         Person*p2=[Person new];

         P2->weight=50.0

         [pwalk];

return 0;

}

这段代码执行的结果为:

wKiom1SHEMuB1ACJAAC3JrJIih8366.jpg

例四:

#Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”%i岁、%f公斤的人走了一段路ageweight)

}

@end

Int main()

{

         Person*p=[Person new];

         p->age=20;

         p->weight=50.0;

         Person*p2=p;

         p->age=30;

         [pwalk];

return 0;

}

这段代码执行的结果为:

wKiom1SHEPPwfY-kAACoVCb7I_c019.jpg

 

此过程内存分析:

wKioL1SHEYiT1qGPAACfYVhbFBY876.jpg

例五:

#Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”%i岁、%f公斤的人走了一段路ageweight)

}

@end

Int main()

{

         Person*p=[Person new];

         p->age=20;

         p->weight=40;

Person*p=[Person new];

         P2->age=30;

P2->weight=50

P=p2

P2->age=40;

[p2 walk];

return 0;

}

这段代码执行的结果为:

wKioL1SHEbyif22PAACuCmgUh4E901.jpg

内存分析:

wKiom1SHETCisO2GAADRmhzNOl4186.jpg


综上所属,本章节主要讲的是指针的属性,当指针指向谁就改变谁的值!

例六:增加一个方法

#Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

-(void)eat;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”%i岁、%f公斤的人走了一段路ageweight)

}

-(void)eat

{

NSLog(@”%i岁、%f公斤的人吃饭了ageweight)

 

}

@end

Int main()

{

         Person*p=[Person new];

         p->age=20;

         p->weight=40;

[p eat];

[p walk];

return 0

}

例七:

 #Imort <Foundation/Foundation.h>

@interface PersonNSObject

{

//成员变量;(成员变量必须写在大括号里面)

@public

Int age;

double weight;

}

-(void)walk;

-(void)eat;

@end

//方法声明;

//2.类的实现

@implementation Person

//实现@interface中声明的方法

-(void)walk

{

NSLog(@”%i岁、%f公斤的人走了一段路ageweight)

}

-(void)eat

{

NSLog(@”%i岁、%f公斤的人吃饭了ageweight)

 

}

@end

Int main()

{

         Person*p=[Person new];

         p->age=20;

         p->weight=40;

[p eat];

[p walk];

Person*p2=[Person new];

         P2->age=30;

         P2->weight=50;

[p2 eat];

[p2 walk];

 

return 0

}

分析再内存中的细节分析:

每个对象都占用一个存储空间;

类在内存中也占据存储空间,但是只占据一个存储空间;当你第一次使用类的时间被创建再内存空间中;

在使用类创建对象之前,会将类加载到内存

每个对象内部都有一个默认的指针——isaisa指针的作用是指向同一个类;

wKioL1SHEeSyLCcAAAEIS9b5DR4481.jpg

 

OC中对象跟函数的注意点

例一:

#Import   <Foundation/Foundation.h>

@Interface  CarNSObject

{

//成员变量

@public

Int  wheels

Int  speed

}

-voidrun

@end

@implementation Car

-voidrun

{

NSLog@%d个轮子,速度为%dkm/h的车子跑起来”wheelsspeed);

}

@end

Void testint  wint  s

{

       W=20

       S=200

}

Int main()

{

       Car *c=[Car new]

       c->wheels=4;

       c->speed=250;

       test(c->wheels, c->speed);

[c run];

return 0

}

这段代码的运行结果是:

wKiom1SHEX3BrGtzAAD-N4kd4zU593.jpg

例二:

#Import   <Foundation/Foundation.h>

@Interface  CarNSObject

{

//成员变量

@public

Int  wheels

Int  speed

}

-voidrun

@end

@implementation Car

-voidrun

{

NSLog@%d个轮子,速度为%dkm/h的车子跑起来”wheelsspeed);

}

@end

Void testint  wint  s

{

       W=20

       S=200

}

Void test1Car *newC

{

       newC->wheels=5;

}

Int main()

{

       Car *c=[Car new]

       c->wheels=4;

       c->speed=250;

       test1c);

[c run];

return 0

}

这段代码的运行结果是:

wKioL1SHEjiA_YFAAACo9eUhxmw486.jpg

内存分析:

wKiom1SHEazDQiRqAACPnZFmHQc126.jpg

例三:

#Import   <Foundation/Foundation.h>

@Interface  CarNSObject

{

//成员变量

@public

Int  wheels

Int  speed

}

-voidrun

@end

@implementation Car

-voidrun

{

NSLog@%d个轮子,速度为%dkm/h的车子跑起来”wheelsspeed);

}

@end

Void testint  wint  s

{

       W=20

       S=200

}

Void  test1Car *newC

{

       newC->wheels=5;

}

Void  test2Car  *newC

{

       Car *c2=[Car new];

       c2->wheels=5;

       c2->speed=300;

       newC->wheels =6

}

Int main()

{

       Car *c=[Car new]

       c->wheels=4;

       c->speed=250;

       test2c);

[c run];

return 0

}

这段代码的运行结果是:

wKiom1SHEdCwZgGBAACjJhlhhMc853.jpg

整个过程中对象c指向的一直都是第一个内存地址所以输出的跟对象C2没有任何关系

 

常见错误.

1.@interface@implementationde 分工

wKioL1SHEm6BrGwuAACyzcyd8Io926.jpg

1@interface就好像暴露在外面的时钟表面

2@implementation就好像隐藏在时钟内怒的构造实现

2.声明和定义多个类

3.常见的错误

1)只有类的声明没有类的实现

2)漏掉@end

3@interface@implementation嵌套

4)两个类的声明嵌套

5)成员变量没有有些在括号里面

6)方法的声明卸载了大括号的里面

4.语法细节

1)成员变量不能再{}中进行初始化、不能被直接拿出去访问

2)方法不能当作函数一样调用

3)成员变量\方法不能使用static等关键次修饰,别跟C语言混在一起

4)类的实现可用写在卖弄函数的后面,主要把声明放在前面就行了

wKioL1SHEoXzWyHUAAEmrt0FT7k760.jpg

5OC方法和函数的区别

1OC方法只能声明在@interface@end之间,只能实现在@implementation@end之间,也就是说OC方法不能独立于类的存在

2C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

3)对象方法都是以减号开头,函数属于整个文件可以放到文件的任何一个地方,但是不能放到声明文件(@interface@end之间)中去,假如函数放到了主函数的后面,必须要在主函数中进行调用!函数的调用不依赖与对象!

4)在声明中注意成员变量时候被全局调用,再声明中成员变量默认的为@protected不是@public

5)函数内部是不能直接通过成员变量名访问某个对象的变量。

基本类型的属性

/*

学生

成员变量:性别、生日、体重、最喜欢的颜色、狗(体重,吃,跑)

方法:吃、跑、遛狗、喂狗

*/

Typedef  enum{

SexMan

SexWoman

}Sex//枚举常量一定要包含枚举类型的名称,前面加一个K表示是常量

Typedef  struct{

Int year;

Int month;

Int day;

}Date

Typedef enum{

ColorBlack;

ColorRed;

ColorYellow;

}Color

#import<Foundation/Foundation.h>

@interface Student : NSObject

{

//如果变量有固定的类型一般都用枚举

@public

       Sex sex//性别

       Datebirthday;//生日

       Double weight;//体重(KG

       Color facColor;//最喜欢的颜色

       Char *name

}

-voideat

-voidrun

-(void)print;

@end

@implementationStudent

-voideat

{

       Weight +=1//每吃一次体重就+1

       NSLog@“吃完这次后的体重是%d”,weight);

}

-voidrun

{

       Weight-=1//没跑完运动一次体重就-1

       NSLog@“跑完这次后的体重是%d”,weight);

}

-(void)print

{

NSLog(@”性别=%d,喜欢的颜色=%d,姓名=%c,生日为%d-%d-%d”sexfavColor,name,birthday.year,birthday.maonth,birthday.day);

}

@end

Intmain()

{

       Student *s=[Studentnew];

       s->name=”Jack”;

       s->weight=50;

       //性别

       s->sex=SexMan;

//s->birthday={2011,9,10};这个写法是错误的

Date d={2011,9,10};

s->birthday=d;

/*

上面两行代码等价于下面的三行代码

s->birthday.year=2011;

s->birthday.month=9;

s->birthday.day=10;

*/

s->facColor=ColorBlack;

       [s eat];

       [s eat];

[s run];

[s run];

[s print];

       return0

}

 

例二:

/*

学生

成员变量:性别、生日、体重、最喜欢的颜色、狗(体重,毛色,吃,跑)

方法:吃、跑、遛狗、喂狗

*/

Typedef  enum{

SexMan

SexWoman

}Sex//枚举常量一定要包含枚举类型的名称,前面加一个K表示是常量

Typedef  struct{

Int year;

Int month;

Int day;

}Date

Typedef enum{

ColorBlack;

ColorRed;

ColorYellow;

}Color

#import<Foundation/Foundation.h>

@interface Student : NSObject

{

//如果变量有固定的类型一般都用枚举

@public

       Sex sex//性别

       Datebirthday;//生日

       Double weight;//体重(KG

       Color facColor;//最喜欢的颜色

       Char *name

}

-voideat

-voidrun

-voidliuDog

-voidweiDog

 

-(void)print;

@end

@interface Dog NSObject

{

       Double weight// 体重

       Color curColor//毛色

}

-voideat

-voidrun

 

@end

@implementation Dog

-voideat

{

    [Dog eat];

}

-voidrun

{

         [Dogeat];

}

@end

@implementationStudent

-voideat

{

       Weight +=1//每吃一次体重就+1

       NSLog@“吃完这次后的体重是%d”,weight);

}

-voidrun

{

       Weight-=1//没跑完运动一次体重就-1

       NSLog@“跑完这次后的体重是%d”,weight);

}

-voidliuDog

{

Weight-=1//没跑完运动一次体重就-1

       NSLog@“溜完狗之后的体重是%d”weight);

 

}

-voidweiDog

{

Weight +=1//每吃一次体重就+1

       NSLog@“喂完狗之后的体重是%dweight);

 

}

 

-(void)print

{

NSLog(@”性别=%d,喜欢的颜色=%d,姓名=%c,生日为%d-%d-%d”sexfavColor,name,birthday.year,birthday.maonth,birthday.day);

}

@end

Intmain()

{

       Student *s=[Studentnew];

       Dog  d = [Dog new];

       d->curColor=ColorYellow;

       d->weight=20;

       s->dog = d;

       s->name=”Jack”;

       s->weight=50;

       //性别

       s->sex=SexMan;

//s->birthday={2011,9,10};这个写法是错误的

Date d={2011,9,10};

s->birthday=d;

/*

上面两行代码等价于下面的三行代码

s->birthday.year=2011;

s->birthday.month=9;

s->birthday.day=10;

*/

s->facColor=ColorBlack;

       [s eat];

       [s eat];

[s run];

[s run];

[s print];

[s liuDog];

[s weiDog];

       return0

}

方法的声明跟实现的深入了解

例题

/*

计算器类

       方法:

  1. 1.    返回π

  2. 2.    计算两个整数的和

  3. 3.    计算某个整数的平方

*/

#import<Foundation/Foundation.h>

@interfaceJiSuanQi : NSObject

{

 

}

-(void)pi;

//OC方法中,一个参数对应一个冒号

-(int)PingFang:(int)num;

-(int)sumWithNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

-(void)pi;

{

       Return3.1415926;

}

-(int)pingFang:(int)num

{

       Return num*num;

}

-(int)sumWithNum1:(int)num1 andNum2:(int)num2

{

       Return num1+num2;

}

@end

Int  main()

{

       JiSuanQi  jsq = [JiSuanQi new];

       Double a=[Jsqpi];

       NSLog(@”π的值为:%f”a);

       Int b=[jsq pingFang:10];

       NSLog(@”这个整数的平方是%d”b)

Int c=[jsq sumWithNum1:10  andNum2:5];

       NSLog(@”这两个整数的和是%d”c)

       Return 0;

}

本章小结:

1)一个参数对应一个冒号,当有多个参数的时间要对每个参数进行描述!

2)如果带参数的方法的命名中冒号也是方法名的一部分

提示:再xcod中再上面有一个Interface中能快速查看方法名!

 

                           

wKioL1SHJH_jZgoIAACjxfUVEWA818.jpg

wKiom1SHI-qisaznAADlW3t_jv8233.jpg

wKioL1SHJICznPfbAAC4ix0C_Oc198.jpg

wKioL1SHJICTGvXqAACIA4NdGv8827.jpg



 

练习

Car类设计一个方法,用来和其他车比较车速,返回差距的车数;

#import<Foundation/Foundation.h>

@interfaceCar : NSObject

{

       @public

       Int speed;

}

-(int)compareSpeedWithOther:(Car  *)other;

@end

@implementationCar

-(int)compareSpeedWithOther:(Car  *)other

{

       //speed

       //other->speed

       Return speed-other->soeed;

}

@end

Int main()

{

       Car *c1=[Car new];

       c1->speed=300;

Car *c2=[Car new];

c1->speed=280;

int a=[c1 compareSpeedWithOther:c2]

NSLog(@“%d”,a);

return 0;

}

匿名对象

#import<Foundation/Foundation.h>

@interfaceCar : NSObject

{

       @public

       Int speed;

}

-(int)run;

@end

@implementationCar

-(int)run

{

        NSLog(@”速度为%d的车子跑起来speed);

}

@end

Int main()

{

       Car *c=[Car new];

       c->speed=300;

       [c run];

return 0;

}

匿名对象格式为:

#import<Foundation/Foundation.h>

@interfaceCar : NSObject

{

       @public

       Int speed;

}

-(int)run;

@end

@implementationCar

-(int)run

{

        NSLog(@”速度为%d的车子跑起来speed);

}

@end

Int main()

{

       [Car new]->speed=300;

       [[Car new]  run];

return 0;

}

注意一般不要些匿名对象的代码否则会造成内存泄漏!


本文出自 “我成IT成长之路” 博客,请务必保留此出处http://jeason.blog.51cto.com/9704473/1588120

2014年12月9日星期二 oc学习笔记