IOS开发学习笔记009-OC基本知识

开始学习OC,时间不等人啊,要抓紧了。

OC基本知识

新建一个以.m结尾的文件,这既是oc的程序文件。在oc程序中完全兼容C语言。编译好链接类似。

oc包含头文件是使用#import <>

import 和include 的区别:

  1:import和include一样的包含功能

  2:import可以自动防止文件被重复拷贝

1 #import <Foundation/NSObjCRuntime.h>//NSLog头文件
2 //import 1:和include一样
3 //       2:可以自动防止文件被重复拷贝
4 int main()
5 {
6     NSLog(@"this is OC output");//自动换行
7     return  0;
8 }

如果使用Foundation框架,则编译的时候需要添加参数 cc -c -framework Foundation a.m

每个框架都有自己的主头文件,和框架名一样,包含所有头文件。

如果有多个文件,编译顺序和c语言一样: cc -c one.m two.m -framework Foundation

BOOL类型(OC特有的)

  定义:typedef signed char BOOL;

  两种取值:

  #define YES (BOOL) 1

  #define NO (BOOL) 0

 1 #import <Foundation/Foundation.h>
 2 
 3 int main()
 4 {
 5     BOOL b = YES;//1
 6     BOOL b2 = NO;//0
 7     
 8     NSLog(@"%d	%d",b,b2);//1    0
 9     return 0;
10 }

面向对象

万物皆对象。

常用术语

  面向过程 Procedure Oriented

  面向对象 Object Oriented,简称OO

  面向对象编程 Object Oriented Programming,简称OOP

类和对象的区别

  类是对象的抽象。

  对象是类的实例。

类的构成:

   1、类名

      首字母大写,不能下划线,多个单词每个首字母大写

   2、属性

   3、行为(功能)

类的实现

 

 1 /*
 2  3  1、类名
 4     首字母大写,不能下划线,多个单词每个首字母大写
 5  2、属性
 6  3、行为(功能)
 7 */
 8 
 9 #import <Foundation/Foundation.h>//NSObject
10 
11 //1、类的声明:属性和行为
12 @interface Car : NSObject//继承NSObject,使类具有创建对象的功能
13 {
14     //属性,也就是成员变量(实例变量),默认会初始化为0,默认是保护属性
15     @public
16     int wheels;//轮胎个数
17     int speed;//时速
18 }
19 
20 //方法(行为):返回值,方法名,参数
21 //只要是oc对象的方法,必须以‘-’开头
22 //OC方法中任何数据类型都必须用"()"括起来
23 //OC方法中小括号就是用来括住数据类型
24 - (void) run;
25 
26 @end
27 
28 
29 
30 
31 //2、类的实现,用力实现@interface中声明的方法
32 @implementation Car
33 //方法的实现
34 - (void) run
35 {
36     NSLog(@"Running!");
37 }
38 @end
39 
40 int main()
41 {
42     //创建对象,返回对象的地址
43     Car *p = [Car new];//OC中执行任何行为都需要这个 [行为执行者 行为];
44     p->wheels = 4;//赋值
45     p->speed = 60;//赋值
46     
47     [p run];//调用方法
48     
49     NSLog(@"speed is %d!",p->speed);//输出速度
50 
51     return 0;
52 }

在类创建对象之前会把类加载到内存中,每个对象还都有一个ISA 指针,指向这个类。

对象和函数的区别

  • OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
  • C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
  • C函数不能访问OC对象的成员
  • 低级错误:方法有声明,但是实现的时候写成了函数
 1 #import <Foundation/Foundation.h>
 2 
 3 
 4 //1、类的声明
 5 @interface Person: NSObject
 6 {
 7     @public
 8     int age;//年龄
 9     double weight;//体重
10 }
11 
12 
13 - (void)walk;//行走
14 
15 @end
16 
17 //函数1
18 void test(int age,int wei)
19 {
20     age = 20;
21     wei = 200;
22 }
23 //函数2
24 void test1(Person *p)
25 {
26     p->age = 20;
27     p->weight = 200;
28 }
29 
30 //2、类的实现
31 @implementation Person
32 //实现@interface中声明的方法
33 - (void)walk//行走方法的实现
34 {
35     NSLog(@"The person whoes age is %d and weight is %f is walking !",age,weight);
36 }
37 
38 @end
39 
40 int main()
41 {   
42     Person *p1 = [Person new];//新建一个对象
43     p1->age = 25;//年龄赋值
44     p1->weight = 66.7;//体重赋值
45     [p1 walk];//walk方法调用
46     
47     Person *p2 = [Person new];//新建一个对象
48     p2->age = 45;//年龄赋值
49     p2->weight = 77.0;//体重赋值
50     [p2 walk];//walk方法调用
51     
52     //p2 = p1;//对象间赋值
53     
54     //对象和函数
55     test(p1->age,p1->weight);//值传递,不改变原值
56     [p1 walk];//walk方法调用
57     test1(p1);//传地址,改变原值
58     [p1 walk];//walk方法调用
59 
60     return 0;
61 }

@interface 和@implementation分工

@interface 就相当于钟表表面

@implementation就是钟表内部的-实现

常见错误

  1、只有类的声明,没有类的实现

  2、漏了@end

  3、@interface和@implementation嵌套

  4、两个类的声明嵌套

  5、成员变量没有写在括号里面

  6、方法的声明写在了大括号里面

方法和函数的区别

 方法:

 1、方法都是以减号开头的

 2、方法声明必须写在@interface和@end之间

      方法定义必须写在@implementation和@end之间

 3、方法只能由对象来调用

 4、方法归对象/类所有

 函数:

 1、函数归文件所有,能写在除#interface和@end之间的任意位置

 2、函数调用不依赖与对象

类的简单设计

  1 #import <Foundation/Foundation.h>
  2 /*
  3  学生类:
  4  狗类
  5  */
  6 
  7 
  8 //性别
  9 typedef enum
 10 {
 11     SexMan,//男
 12     SexWoman//女
 13 } Sex;
 14 //生日
 15 typedef struct
 16 {
 17     int year;//年
 18     int month;//月
 19     int day;//日
 20 } Date;
 21 //颜色
 22 typedef enum
 23 {
 24     ColorBlack,//黑色
 25     ColorRed,//红色
 26     ColorGreen//绿色
 27 } Color;
 28 
 29 //类的声明:狗
 30 @interface Dog : NSObject
 31 {
 32     @public
 33     double weight;//体重
 34     Color curColor;//毛色
 35 }
 36 //方法声明
 37 - (void) eat;//吃
 38 - (void) run;//走
 39 
 40 @end
 41 
 42 
 43 @implementation Dog
 44 
 45 //方法实现
 46 - (void) eat
 47 {
 48     weight += 1;
 49     NSLog(@"狗吃过体重是%f",weight);
 50 }
 51 
 52 - (void) run
 53 {
 54     weight -= 1;
 55     NSLog(@"狗溜过体重是%f",weight);
 56 }
 57 
 58 
 59 @end
 60 
 61 
 62 
 63 //类的声明 :学生
 64 @interface Student : NSObject
 65 {
 66     @public
 67     Sex sex;//性别
 68     Date birthday;//生日
 69     double weight;//体重
 70     Color FavColor;//最喜欢的颜色
 71     char *name;//姓名
 72     //狗,对象中对象,指针
 73     Dog *dog;//OC中得其他对象必须是指针
 74 }
 75 //方法声明
 76 - (void) eat;//吃
 77 - (void) run;//走
 78 - (void) print;//输出
 79 - (void) walkingDog;//遛狗
 80 - (void) feadDog;//喂狗
 81 @end
 82 
 83 //类的实现
 84 @implementation Student
 85 //方法实现
 86 - (void) eat
 87 {
 88     weight += 1;
 89     NSLog(@"吃过体重是%f",weight);
 90 }
 91 
 92 - (void) run
 93 {
 94     weight -= 1;
 95     NSLog(@"运动过体重是%f",weight);
 96 }
 97 
 98 - (void) print
 99 {
100     NSLog(@"Sex is %d,birthday is %d-%d-%d,favourate color is %d",sex,birthday.year,birthday.month,birthday.day,FavColor);
101 
102 }
103 
104 
105 - (void) walkingDog
106 {
107     [dog run];
108 }
109 - (void) feadDog
110 {
111     [dog eat];
112 }
113 @end
114 
115 
116 
117 int main()
118 {
119     Student *pStu = [Student new];//新建对象
120     pStu->dog = [Dog new];//新建狗对象
121     pStu->dog->weight = 20;//狗的体重
122     pStu->dog->curColor = ColorBlack;//狗的颜色
123     pStu->weight = 50;//学生体重
124     
125     pStu->sex = SexMan;//学生性别
126     
127     Date d = {1990,3,5};//学生年龄
128     pStu->birthday = d;//赋值
129     
130     pStu->FavColor = ColorGreen;//学生最喜欢的颜色
131     
132     pStu->name = "ZhangSan";//学生姓名
133     
134     [pStu eat];//调用方法eat
135     [pStu eat];//调用方法eat
136     [pStu run];//调用方法run
137     
138     [pStu print];//调用方法print
139     [pStu walkingDog];//调用方法
140     [pStu feadDog];//调用方法feadDog
141     return 0;
142 }

方法的参数

oc方法中,一个参数对应一个冒号。

- (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号. 方法名是pingfang: 包括后面的冒号。

- (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数。方法名是:SumwithNum1:andNum2:

 1 #import <Foundation/Foundation.h>
 2 
 3 /*
 4  计算器类:
 5  返回数值n
 6  计算平方
 7  计算和
 8  */
 9 
10 @interface JiSuanQi : NSObject
11 
12 -(double) pi;
13 //方法名是 pingfang:
14 - (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号
15 //- (int) Sum:(int)a :(int)b;
16 //方法名是:SumwithNum1:andNum2:
17 - (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数
18 @end
19 
20 
21 @implementation JiSuanQi
22 - (double) pi
23 {
24     return 3.14;
25 }
26 - (int) pingfang:(int)num//oc方法中,一个参数对应一个冒号
27 {
28     return num * num;
29 }
30 - (int) SumwithNum1:(int)num1 andNum2:(int)num2
31 {
32     return num1 + num2;
33 }
34 @end
35 
36 
37 int main()
38 {
39     JiSuanQi *p = [JiSuanQi new];//新建对象
40     double d= [p pi];//调用pi方法
41     NSLog(@"%f",d);
42     int n = [p pingfang:10];//调用平方方法
43     NSLog(@"%d",n);
44     //这样写比较好理解
45     int sum = [p SumwithNum1:10 andNum2:20];//调用方法sum
46     NSLog(@"%d",sum);
47     return 0;
48 }

练习2:

 1 /*
 2  3     方法:比较车速
 4  */
 5 
 6 //
 7 @interface Car : NSObject
 8 {
 9 @public
10     int speed;
11 }
12 - (int) comapreSpeedWithOther:(Car *)other;
13 
14 @end
15 
16 @implementation Car
17 - (int) comapreSpeedWithOther:(Car *)other
18 {
19     return speed - other->speed;
20 }
21 
22 @end
23 
24 int main()
25 {
26     Car *p1 = [Car new];
27     Car *p2 = [Car new];
28     p1->speed = 200;
29     p2->speed = 300;
30     int res = [p1 comapreSpeedWithOther:p2];
31     NSLog(@"%d",res);
32     return 0;
33 }
View Code

匿名对象的使用

[Car new]->speed = 300;//匿名对象

int main()

{

    //匿名对象,不要这样写,会造成内存泄露

    [Car new]->speed = 300;

    //不要这样写,会造成内存泄露

    [[Car new] run];

    return 0;

}

Xcode文档安装

1、直接找到Xcode文件路径,把离线文件复制进去

  /Applications/Xcode.app/Contents/Developer/Documentation/DocSets

2、放到硬盘某路径下

  /Users/用户名/Library/Developer/Shared/Documentation/DocSets

原文地址:https://www.cnblogs.com/songliquan/p/4430383.html