您的位置:首页 > 移动开发 > Objective-C

初见Object C

2020-06-29 04:45 786 查看

阅前提示

入门级文章,不涉及深入研究,需要一点其他语言基础,此文章主要我个人对学习下来的总结笔记。
基本语法不过多赘述,可直接看代码来了解。
文章主要涉及部分:
OC 面向对象
Foundation库相关 待补充
技巧与关键字 不断更新

Object C

面向对象

​ 一个类可以分为三个部分:interface 、inplementation、program

​ 一般 interface 部分会写在.h文件中 ,inplementation 部分写在.m文件中

​ 方法声明:

- (void) setNum : (int) a;
// 方法类型 (返回类型) 方法名 (:有参数的方法) (参数类型) 参数名

例:简单的类

//@interface  声明类的 继承关系、属性和方法
@interface ASimpleClass : NSObject
{NSString *name;}
-(void) print; //负号开头代表是实例方法
//+(void) print;// 正号代表类本身的方法
-(void)setName :(NSString*) _name;
-(void)setNum : (int) n;
-(int) getSum : (int) a1 : (int) a2;
@end

//@implementation 主要是对声明进行具体定义
@implementation ASimpleClass
{
int num;
}
-(void) print
{
NSLog(@"%@", name);
}
- (void)setName:(NSString*)_name
{
name = _name;
}
-(void) setNum:(int)n
{
num = n;
}
- (int)getSum:(int)a1 :(int)a2
{
return a1 + a2 + num;
}
@end

//program 包含解决特点问题的代码,可以跨越多个文件
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Hello, World!");
//注意同文件前后文影响
ASimpleClass *cA;//*号代表指针,即引用
cA = [ASimpleClass new];//创建类实例 等同于 *Class = [[ASimpleClass alloc] init];
ASimpleClass *cB = [[ASimpleClass alloc] init];
[cA setName:@"class A"];
[cB setName:@"class B"];
[cA print];
[cB print];
[cA setNum:0];
NSLog(@"Sum : %i",[cA getSum:2 :3]);
}
return 0;
}

例:一般类

@property + @synthesize 合成存取方法,相当于get set

// NormalClassA.h
#import <Foundation/Foundation.h>
@interface NormalClassA : NSObject
@property NSString* name ; // @property + @synthesize 等同于使其获得了get,set功能
@property int num;
-(void) print;
-(void)setNum : (int) n;
-(int) getSum : (int) a1 : (int) a2;
@end
//  NormalClassA.m
#import <Foundation/Foundation.h>
#import "NormalClassA.h"
@implementation NormalClassA
@synthesize num;// 这里可以省略,但在这里使用时需要以(_)下划线字符开头
- (int)getSum:(int)a1 :(int)a2
{
return a1 + a2;
}
- (void)print
{
NSLog(@"%@:%i",_name,num);
}
@end

分类

基本分类

@interface 类名(类别名){属性} @end

// NormalClassA.h
#import <Foundation/Foundation.h>
@interface NormalClassA : NSObject
@property NSString* name ; // @property + @synthesize 等同于使其获得了get,set功能
@property int num;
-(void)setNum : (int) n;
-(int) getSum : (int) a1 : (int) a2;
@end
// Pinter.h
#import "NormalClassA.h"
@interface NormalClassA(Pinter)
-(void)print:(NSString*) msg
@end
// Pinter.m
#import "Pinter.h"
@implementation  NormalClassA(Pinter)
-(void)print:(NSString*) msg
{...}
@end

扩展

@interface 已有类(){属性} @end

扩展相当于匿名类别,扩展用于临时的对某个类的接口进行扩展,在类的实现部分同时实现类接口部分声明的函数与扩展部分声明的函数

在定义类的扩展时,可以添加成员变量与属性,但定义类别时不允许添加成员变量与属性

@interface NormalClassA()
-(void)Dispose;
@end

@implementation  NormalClassA
...
-(void)Dispose{...}
@end

协议

协议的定义

@protocol protocolName <这里可以写继承的协议/或者不写>
...//方法声明
@end

@interface NormalClassA : NSObject <protocolName,...>
...
@end

约束

@protocol protocolName
@required methodName;//必须被实现 不加也是默认为此
@optional methodName;//可选择实现
@end

使用

@portocol IDispose
-(void)Dispose;
@end

@interface NormalClassA : NSObject <IDispose>
...
@end

@implementation NormalClassA
...
-(void)Dispose{...}
@end

id <IDspose> d;
NormalClassA *a = [NormalClassA new];
d = a;
a.Dispose;
d.Dispose;

Foundation

TODO

技巧

多参数方法定义

-(void) Print : (int) a and : (int) b
[c Print:1 and 2]
-(void) Pirnt : (int) a : (int)b
[c Print:1:2]

关键字

@class

​ 用来告诉编译器这是一个类,编译器只需要通过指针来引用它即可,并不需要知道关于这个类的更多信息,可以用来减少编译。

@selector

每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL类型的数据就可以找到方法的地址,进而调用方法。

typedef struct objc_selector *SEL;

SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,其实发送的消息就是SEL

对于所有的类,只要方法名是相同的,产生的selector都是一样的。

@selector(meathName)就是取类方法的编号,等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取. 它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)

//对象是否能相应selector指定的方法 YES/NO
-(BOOL) respondsToSelector:Selector
//应用selector指定的方法
-(id)performSelector :selector withObject:obj1 whitObject : obj2

例:

id value = [ASimpleClass new];
SEL action = @selector(print);
if([value respondsToSelector:action] == YES)
{
[value setName:@"A"];
[value performSelector:action];//A
}

super

​ 用于子类调用父类方法,在重载的时候用的比较多

self

指代本身,相当于C# 的 this

id

id 数据类型可以用来保存任何类型的对象。

id value;
ClassA *a = [ClassA new];
ClassB *b = [ClassB new];
value = a;
[value print];//执行a的print方法
value = b;
[value print];
//执行b的print方法

extern

用来声明在其他文件中的全局变量。

// A.h
int globalVar = 1;
// other.m
#import "A.h"
extern int globalVar;
//这是在告诉编译器,我申明的这个变量在其他文件中,你去帮我到其他文件找,如果找不到当你使用这个变量时会报错,所以确定变量名一致

static

在OC中,在变量声明前加上关键字static,只会初始化一次是它的特性。一般用在方法中,统计方法的执行次数,定义一个static修饰的变量比较好。

typedef

给某种类型顶一个定义比较容易记的名字

简化较为复杂的类型声明

typedef int I;
I a,b;
typedef enum AEnum
{
A = 0,
B,
C,
} Answer;
Answer a = A;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: