Objecitive-C基础教程-基础语法
Objective-C 是一种简单的计算机语言,设计为可以支持真正的面向对象编程。
Objective-C 通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的 ANSI C 语言。类的语法和设计主要是基于 Smalltalk,最早的面向对象编程语言之一。
如果你以前使用过其他面向对象编程语言,那么下面的信息可以帮助你学习 Objective-C 的基本语法。许多传统的面向对象概念,例如封装,继承以及多态,在 Objective-C 中都有所体现。这里有一些重要的不同,但是这些不同在这文章会表现出来,而且如果你需要还有更多详细的信息存在。
如果你从来没有使用任何编程语言编过程序,那么你至少需要在开始之前,对相关概念进行一些基础的了解。对象的使用和对象对象架构是 iPhone 程序设计的基础,理解他们如何交互对创建你的程序非常重要。想了解面向对象概念的,请参看使用 Objective-C 进行面向对象编程。
Objective-C:C的超集
Objective-Objective-C是C语言的严格超集--任何C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。Objective-C被描述为盖在C语言上的薄薄一层,因为Objective-C的原意就是在C语言主体上加入面向对象的特性。
Objective-C代码的文件扩展名
扩展名 | 内容类型 |
---|---|
.h | 头文件。头文件包含类,类型,函数和常数的声明。 |
.m | 源代码文件。这是典型的源代码文件扩展名,可以包含 Objective-C 和 C 代码。 |
.mm | 源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。 |
当你需要在源代码中包含头文件的时候,你可以使用标准的 #include 编译选项,但是 Objective-C 提供了更好的方法。#import 选项和 #include 选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C 的例子和文档都倾向于使用 #import,你的代码也应该是这样的。
语法
Objective-C的面向对象语法源于Smalltalk消息传递风格。所有其他非面向对象的语法,包括变量类型,预处理器(preprocessing),流程控制,函数声明与调用皆与C语言完全一致。但有些C语言语法合法代码在objective-c中表达的意思不一定相同,比如某些布尔表达式,在C语言中返回值为true,但在Objective-C若与yes直接相比较,函数将会出错,因为在Objective-C中yes的值只表示为1。
第一个 Objective-C 程序,基于Xcode :
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
NSLog(@"Hello World!");
}
return 0;
}
1.什么是对象?
对象是现实生活中的1个具体存在。看得见、摸得着,拿过来直接可以使用。
2.什么是类?
类是对一群具有相同特征或者行为事物的1个统称,抽象的。不能够直接使用。
案例:
食物. -->类
水果. -->类
桌子上的那一个水果. -->对象交通工具. -->类
汽车. -->类
公司门口的那一辆奔驰. -->对象
3.类和对象之间的关系
- 类是模板,类的对象是根据这个模板创建出来的。
- 类模板中有什么,对象中就有什么。
4.如何设计类
类的作用:
- 用来描述一群具有相同特征和行为的事物
设计类的三要素:
1.类的名字,你要描述这类事物的名字。
2.这类事物具有的相同的特征,这类事物拥有什么。
3.这类事物具有的共同的行为,这类事物会做什么。
5.如何找到类
- 名词提炼法:分析整个业务流程,分析出现了哪些名词,这些名词就是你要找的类。
类的定义
问题:请问是先有类还是先有对象?
从现实的角度:一定先有对象再有类。
从代码的角度:一定先有类再有对象。
-
如何定义类
1.类的三要素。
2.定义类的语法。a.位置:直接写在源文件之中,不要写在main函数之中。
b.类的定义:
->类的声明:
@interface 类名:NSObject
{
这类事物具有的共同特征。将它们定义为变量。
}
功能就是一个方法。此处写方法的声明。
@end
->类的实现:
@implementation 类名
此处写方法的实现。
@end
#import<Foundation/Foundation.h>
@interface Preson : NSObject
{
NSString *_name;
int _age;
float _height;
}
@end
@implementation Preson
@end
int mian(int argc, const char * argv[])
{
return 0;
}
注意:
- 类必须要有声明和实现;
- 类名用描述的事物名称命名,类名单词首字母必须大写;
- NSObject
- 用来表示这类事物的共同的特征的变量必须要定义在@interface的大括号之中;
- 定义在大括号之中用来表示这类事物的共同的特征的变量叫做属性、成员变量、实例变量、字段;
- 为类定义属性时,属性名必须以_开头。
- 语法是固定的:
@interface 类名:NSOnject
{
这类事物具有的共同的特征定义为变量;
数据类型 变量名1;
数据类型 变量名2;
......
}
@end
@implementation 类名
@end
6.如何创建类的对象
语法:
类名 *对象名 = [类名 new];
Preson *p1 = [Preson new];
根据Person这个类的模板,创建了1个对象的名字叫p1.
p1对象的特点:1、可以直接使用;
2、类中定义的东西,这个对象中也有,不会多也不会少。
7.如何使用对象
-
如何访问对象中的属性
1.默认情况下,对象的属性是不允许被外界直接访问的;
2.如果允许对象的属性可以被外界访问,那么就在声明属性的时候加一个@public关键字。
-
访问对象的属性的方式
对象名 -> 属性名 = 值; // 为对象中的属性赋值 对象名 -> 属性名; // 取出属性值 (一般使用这一种取值方式) (*对象名).属性名; // 取出属性值```
案例
写一个学生类, 属性:姓名 年龄 语文成绩 数学成绩 英语成绩
#import <Foundation/Foundation.h>
@interface Student : NSObject // 创建学生类
{
@public
NSString *_name;
int _age;
int _Chinese;
int _Math;
int _English;
}
@end
@implementation Student
@end
int main(int argc, const char * argv[])
{
Student *s1 = [Student new]; //创建对象
s1->_name = @"Barry"; // 给对象赋值
s1->_age = 18;
s1->_Math = 100;
s1->_English = 98;
s1->_Chinese = 60 ;
NSLog(@"s1对象的姓名是%@,年龄是%d,数学成绩、英语成绩、语文成绩分别是:%d,%d,%d", //输出定义的属性值;
s1->_name,
s1->_age,
s1->_Math,
s1->_English,
s1->_Chinese);
}
8.方法的声明实现调用
1.类的声明和实现
->类的声明 :
@interface 类名:NSObject
{
属性:属性表示类的特征。
}
方法的声明,方法表示类的功能。
@end
->类的实现:
@implementation 类名
方法的实现。
@end
2.一类事物不仅具有相同的特征,还具有相同的行为。
行为就是一个功能,C语言中使用函数来表示一个功能;
OC的类具有行为,我们使用方法来表示..
方法和函数都表示一个功能。
3.无参数的方法。
-
声明
a.位置:在
@interface
的大括弧外面。b.语法:
-(返回值类型)方法名称;
**方法头中的数据类型一定要用小括号括起来!**
-
实现
a.位置:在
@implementation
之中实现;b.语法:将方法的声明拷贝到
@implementation
之中,去掉分号,加上大括号{}
;
-
调用
a.方法是无法直接调用,因为类是不能直接使用的,必须要先创建对象,那么这个对象中就有类中的属性和方法了。
b.调用对象的方法:
[对象名 方法名];
案例
#import <Foundation/Foundation.h>
@interface Porson : NSObject
{
NSString *_name;
int _age;
}
-(void)Run;
@end
@implementation Porson
-(void)Run{
NSLog(@"This is Test!");
}
@end
int main(int argc, const char * argv[])
{
Porson *p1 = [Porson new];
[p1 Run];
}
4.有一个参数的方法
-
声明
a.位置:在
@interface
的大括弧外面。b.语法:
-(返回值类型)方法名称:(参数类型)形参名称; 例:-(void)eat:(NSString *)foodName;
**方法头中的数据类型一定要用小括号括起来!**
-
实现
a.位置:在
@implementation
之中实现;b.语法:将方法的声明拷贝到
@implementation
之中,去掉分号,加上大括号{}
将方法实现的代码写在大括号之中;
-
调用
a.方法是无法直接调用,因为类是不能直接使用的,必须要先创建对象,那么这个对象中就有类中的属性和方法了。
b.调用的语法:
[对象名 方法名:实参];
案例
#import <Foundation/Foundation.h>
@interface Porson : NSObject
{
NSString *_name;
int _age;
}
-(void)eat:(NSString *)foodName;
@end
@implementation Porson
-(void)eat:(NSString *)foodName{
NSLog(@"主人给我的%@真好吃!",foodName);
}
@end
int main(int argc, const char * argv[])
{
Porson *p1 = [Porson new];
[p1 eat:@"红烧肉"];
}
5.带多个参数的方法
-
声明
a.位置:在
@interface
的大括弧外面。b.语法:
-(返回值类型)方法名称:(参数类型)形参名称1 方法名称:(参数类型)形参名称2 :(参数类型)形参名称3;
例:-(int)sum:(int)num1 :(int)num2 :(int)num3;
**方法头中的数据类型一定要用小括号括起来!**
-
实现
a.位置:在
@implementation
之中实现;b.语法:将方法的声明拷贝到
@implementation
之中,去掉分号,加上大括号{}
将方法实现的代码写在大括号之中;
-
调用
a.方法是无法直接调用,因为类是不能直接使用的,必须要先创建对象,那么这个对象中就有类中的属性和方法了。
b.调用的语法:
[对象名 方法名:实参1 :实参2 :实参3];
案例
#import <Foundation/Foundation.h>
@interface Porson : NSObject
{
NSString *_name;
int _age;
}
-(int)sum:(int)num1 :(int)num2 :(int)num3;
@end
@implementation Porson
-(int)sum:(int)num1 :(int)num2 :(int)num3{
int num4 = num1 + num2 + num3;
return num4;
}
@end
int main(int argc, const char * argv[])
{
Porson *p1 = [Porson new];
int sum = [p1 sum:10 :10 :25];
NSLog(@"num4 = %d",sum);
}
带参数的方法声明规范
1.如果方法只有一个参数
要求最好这个方法的名字叫做
xxxWith:
例:-(void)eatWith:(NSString *)foodName; //调用方法时,增强代码的完整可读性
2.如果方法有多个参数
要求最好这个方法的名字叫做
xxxWith:(参数类型)参数名称 and:(参数类型)参数名称 and:(参数类型)参数名称 and:
例1: -(void)sumWith:(int)num1 and:(int)num2 and:(int)num3;
例2: -(void)sumWithNum1:(int)Num1 andNum2:(int)Num2 andNum3:(int)Num3;
注意:
- 同一个类可以创建无数个对象;
- 同一个类的多个对象之间毫无关系,虽然它们拥有相同类型的属性和方法,属性的值是不会相互影响的;
- 在方法实现当中,可以直接访问属性;此方法是通过哪一个对象来调用的,那么方法中的直接访问的属性就是哪个对象的
案例
写一个Student类, 属性: 体重;
方法1: 跑步: 每跑一次步,体重-0.5;
方法2: 吃饭: 每吃一次饭,体重+0.7;
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
@public
NSString *_name;
float _weight;
}
- (void)Run;
- (void)Eat;
@end
@implementation Student
- (void)Run{
NSLog(@"跑步,每跑一次,%@的体重就轻了!",_name);
_Weight -= 0.5f ;
NSLog(@"跑完了,%@的体重是%.2f!",_name,_weight);
}
- (void)Eat{
NSLog(@"吃东西,每吃一次,%@的体重就增长了!",_name);
_weight += 0.7f ;
NSLog(@"吃完了,%@的体重是%.2f",_name,_weight);
}
@end
int main(int argc, const char * argv[])
{
Student *p1 = [Student new];
p1->_name = @"Barry";
p1->_weight = 99.9f ;
[p1 Run];
[p1 Eat];
[p1 Run];
[p1 Eat];
}
9.作业
设计一个“Student”类
1.属性姓名
生日
年龄
身高(单位是m)
体重(单位是kg)
性别
C语言成绩
OC成绩
IOS成绩
2.行为
跑步:每跑一次,身高增加1cm,体重减少0.5kg,输出跑完后的体重;
吃饭:每吃一次,身高增加1cm,体重增加0.5kg,输出吃完后的体重;
学习:每学习一次,3科成绩各增加1分,输出学习完后的3科成绩。
计算总分:算出3科成绩的总分并打印;
计算平均分:算出3科成绩的平均分并打印。
总结
【学习笔记】(一)是对Objective-C的简要介绍,是本人根据网络资源的学习,自我编辑的这份笔记,这也算是自己向Ios开发之路的第一步吧!