GeoffZhu / geoffzhu.github.io

博客
http://geoffzhu.github.io/
18 stars 1 forks source link

Geoff的Object-C学习笔记 #9

Open GeoffZhu opened 6 years ago

GeoffZhu commented 6 years ago

语法篇

基础数据类型

int、float、double、char

int i = 0;
float i = 0.1;
doublle i = 0.1;
char i = 'A';

OC同时支持C语言的字符串

'C语言字符串'
NSSting: @"OC字符串"

变量名是大小写敏感的

限定词

用于对变量限定内存分配大小,关键词如下

long、long long、short、unsigned、signed

// 原本int是32位,通过限定词,扩展为64位,能存放更大的数据,long long同理
long int i
// 如果你只想存个状态码,不需要太大的整数,可以使用short,会得到16位的int变量
short int i

unsigned和signed代表有没有符号,也就是该变量有没有正负号

条件语句和循环语句

条件语句和循环语句中与js完全一致,不在赘述

goto语句

int i;
a:{
   i++ 
}
if (i < 5) goto a;

函数的定义与调用

<!-- 返回值类型(无使用void) + 名字 + (参数类型 参数名)-->
double multiplication (double a, double b) {
    double c = a * b
    return c
}

mutiplication(2.0, 3.0)

NSLog方法,浮点型采用%f输出,整型采用%d输出,字符串采用%s输出,例如

int a = 0;
float f = 0.1; 或 double f = 0.1;
char s = '字符串';
NSString *p = @"NS字符串";

NSLog(@'整型输出:%d', a);
NSLog(@'浮点型输出:%f', f);
NSLog(@'字符输出:%s', s);
NSLog(@'指针地址输出:%p', p);

%@ 打印NSString

面向对象语法

定义一个类

// 引入Foundation头文件,其中包括常见的NSObject, NSString等类。
#import <Foundation/Foundation.h>

// 其中的 : 代表继承的意思,也就是Class1继承自NSObject
@interface Class1 : NSObject

@end

调用类的方式

[类名 方法名] [对象名 方法名]

// 初始化People类的一个实例p1
People *p1 = [[People alloc] init];
类的成员变量和属性
@interface Class1 : NSObject
{
    // 成员变量,这个例子是写在了.h文件中,不过已经推荐把成员变量写在.m文件中了
    int i = 0;
    NSString *peopleName
}

@property (nonatomic, strong) NSString *peopleName;
@end

如果声明了一个名为peopleName的属性,xcode会在类内自动创建一个名为_peopleName的成员变量。

对象方法和类方法

OC中定义类中的方法分为减号方法和加号方法,减号方法相当对象方法,也就是JavaScript中的Vue.prototype.fun1, 而加号方法被称为类方法(静态方法),类似于javascript中的Vue.nextTick

// 在.h文件中,声明对象上的方法,例如

-(id) initWithID:(int)newID andAge:(int)newAge andPrice:(float)newPrice;

-(返回值) 函数名: (参数类型1) 参数名1 标签1: (参数类型2) 参数名2 …{ 
    函数内容; 
}

+(void) nextTick;

在.m文件中实现类方法的时候还需要注意,类方法中不能调用成员变量。

再来说说带参数调用,例如调用上面的initWithID方法

People *p1 = [[People alloc] init];
[p1 initWithID:1 andAge:10 andPrice:100.0;
// 调用类方法
[People nextTick]

返回值中的id类型和instanceof类型,id类型可以返回任意类型的值,instanceof类型只能返回当前定义的类的实例类型,这在重写NSObject的init方法时经常使用。

访问修饰符

成员变量访问修饰符

@private
私有,只能在类内(.m文件)使用,无法被继承

@protected
受保护,只能在类内使用,可以被继承

@public
公有,能在类内也能在类外使用,使用语法为 ->,例如:
p1 -> varOfPublic

@package
框架权限,在框架内相当于受保护,框架外相当于私有

方法的访问修饰符

OC中方法没有访问修饰符,如果你不想让某个方法在类外被使用,可以直接在.m文件中定义这个方法,外部自然无法调用。

继承与多态

没有多继承,如果想使用多继承的话,要使用协议。继承的语法在上文中也已经出现了

// Class1 集成自NSObject,Foundation的头文件中有NSObject
#import <Foundation/Foundation.h>
@interface Class1 : NSObject
@end

OC中的多态,OC中可以重写方法,但被重写方法的参数和返回值必须要与父类中的一致。换做术语来说就是,OC只支持方法重写,但不支持方法重载。

self与super

这两个都是在类的实现文件中使用的 super为父类,可以调用父类的方法 self为当前类,可以调用当前实现类中的方法