一 . 项目创建
(一). 创建步骤
1.打开Xcode,选择如下。
2.如图
3.如图
完成创建,如图
(二). main文件的结构
1.头文件:#import <Foundation/Foundation.h>
2 . #import:防止重复引用
#include:多次重复编译
@class 一半用在.h文件中防止相互引用,@class告诉编译器将它引用的类只是作为一种类型名,而这个类包含的变量和方法都不会被引入。
如果.m文件需要引用这个类的实体变量或者方法之类的,就在.m中import在@class中声明的类进来。
<>:导入的是系统的库
“”:导入的时自定义的一些文件
3 . @autoreleasepool
这个是自动释放池用于内存管理,详见后章
4.NSLog
NSLog和printf一样,用来打印信息,但他们区别:
(1). NSLog会自己加上换行符
(2). NSLog在Debug下会写到system.log(日志信息)中
(3). NSLog会自动加上时间和进程信息
(4). NSLog支持%@去打印一个对象类型
5 . @:
(1) . 作为OC关键字的起始
(2) . 使用%@可自动调用description方法对该对象进行描述,即打印对象信息
(3) .在iOS5之后,对部分数据类型的简写 比如:@(1) @”” @[] @{}等
二 . 类的创建
创建类的三种方式:
1.可以菜单栏file–new–file
2.选中工程文件,右键newfile
3.command + n
(一). 创建步骤
1.先用command+N创建类,OS X - Source - Cocoa Class。
2.Class:类名,首字母必须大(例:Hero);Subclass of:(从父类继承)父类名,NSObject;Lauguage:语言,OC。
确认保存地址后完成创建,此时左侧栏中会有一个Hero.m文件和Hero.h文件。
三 . 类的结构
一个类一般由一个.h文件和一个.m文件组成。
(一).声明文件 — “.h” 文件
在.h文件中,书写此类的成员变量,以及此类的方法声明。
(1).{ } 内定义类的成员变量
(2).{ }外的下方书写方法的声明
()内写的是该方法返回值的类型,instancetype表示该返回值可以是任意类型,void表示该返回值为空。
#import <Foundation/Foundation.h>
//接口文件 类名 : 父类命
@interface Hero : NSObject
{
//创建对象类型变量带*,成员变量名前加_
NSString *_name;
NSInteger _age;
NSString *_gender;
}
@property (nonatomic,copy)NSString *name;//属性,详见后章
/* -:实例方法(减号方法)
1.调用方式
main函数中:[对象 方法名]
2.格式
.h文件中:
- (返回类型)方法名;
- (返回类型)方法名参数描述名1:(参数类型)参数名;
- (返回值类型)方法名参数描述名1:(参数类型)参数名 参数描述名2:(参数类型)参数名;
3.在方法实现中可以使用成员变量*/
- (void)skill;
//自定义init方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;
/* +:类方法
1.调用方法
main 函数中:[类名 方法名]
2.格式
同上,- 换成 +
3.在方法实现中 不 可以使用成员变量*/
//便利构造法
+ (Hero *)heroWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender;
@end
(二). 实现文件 — “.m “文件
在.h文件中声明的方法,需要在.m文件中实现 ,下面将介绍3中初始化方法:
1 . 重写init(-)
重写父类的方法不需要再.h文件中声明,若重写了父类的方法,系统在运行时会优先调用重写的方法。
2 . 自定义init方法(-)
在.h文件中先声明,方法命名要规范,最好以 “initWith…” 来命名。
3 . 便利方法(+)
在.h文件中先声明,方法命名要规范,最好以 “类名With…” 来命名。
#import "Hero.h"
//实现文件.m
@implementation Hero
- (void)skill{
NSLog(@"name:%@打怪兽!",_name);
}
//重写init,直接在.m文件输入init导出索引即可重写
- (instancetype)init{
self = [super init];//继承父类的init
if (self) {
_name = @"lili";
_age = 33;
_gender = @"man";
}
return self;
}
//自定义init方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender{
self = [super init];//同样需要继承父类的init
if (self) {
_name = name;
_age = age;
_gender = gender;
}
return self;
}
//便利构造法
+(Hero *)heroWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender{
Hero *hero = [[Hero alloc]initWithName:name age:age gender:gender];//使用自定义init
return hero;
}
@end
四 . main函数
与C语言不同的是
字符写法:@”字符”
最后command+R,运行查看打印结果
#import <Foundation/Foundation.h>
#import "Hero.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma mark - 01对象的创建
//分配内存空间
Hero *hero = [Hero alloc];
//初始化
hero = [hero init];
//合并:
Hero *heroa = [[Hero alloc] init];
//new初始化 [[Hero alloc] init] = [Hero new];但是new只能调父类的init
Hero *herob = [Hero new];
NSLog(@"nameHero = %@, nameHeroa = %@, nameHerob = %@",hero.name,heroa.name,herob.name);//重写init,所以有值,不重写为nil
#pragma mark - 02方法的使用
//自定义init
Hero *hero1 = [[Hero alloc] initWithName:@"ki" age:22 gender:@"man"];
NSLog(@"nameHero1 = %@",hero1.name);
//便利构造法,使用类方法
Hero *hero2 = [Hero heroWithName:@"Ahri" age:14 gender:@"woman"];
NSLog(@"nameHero2 = %@",hero2.name);
//使用实例方法
[hero skill];
}
return 0;
}