oc基本知识
(一)构造函数
h文件
#import <Foundation/Foundation.h> @interface Student : NSObject { NSString *_name; NSString *_id; } -(instancetype) initWithName:(NSString *)name ID:(NSString *) idNum; -(void) showInfo; @end
m文件
#import "Student.h" @implementation Student -(instancetype) initWithName:(NSString *)name ID:(NSString *) idNum { if([super init]) { _name=name; _id=idNum; } return self; } -(void) showInfo { NSLog(@"Student name:%@,id:%@",_name,_id); } @end
调用
#pragma 构造函数 Student *s=[ [Student alloc] initWithName:@"Andy" ID:@"01"]; [s showInfo];
(二)block
block为可以实现特定功能的模块,跟C#中采用lamda表达式定义的委托相似
block定义
typedef int (^BlockDef)(int,int);
block使用
#pragma block 类似C#中用lamd定义的委托 BlockDef sumBlock=^(int a,int b) { return a+b; }; NSLog(@"Block get sum:%d",sumBlock(1,2));
(三)协议protocol
类似于C#中的接口
定义,protocol只需要定义方法,在继承此协议的类中去实现
@protocol MyProtocol <NSObject> @required//必须实现 -(void) method1; -(void) method2; @optional//可以不实现 -(void) method3; @end
定义一个类去继承上述协议并实现此协议
#import <Foundation/Foundation.h> #import "MyProtocol.h" @interface Worker : NSObject <MyProtocol> @end
#import "Worker.h" @implementation Worker -(void)method1 { NSLog(@"Protocol method1"); } -(void)method2 { NSLog(@"Protocol method2"); } @end
使用
#pragma protocol 类似接口 Worker *w = [Worker new]; [w method1]; [w method1];
(四)分类
通过分类可以实现方法的扩展,扩展原生的类,可以实现增加方法,方便协作,如下类为person类,通过PersonPP(文件名)对其进行分类扩展,语法为Person(分类名)
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject { NSString *test; @public NSString *_name; NSString *_num; } @end
Person.m
#import "Person.h" @implementation Person //-(void) dealloc //{ // NSLog(@"Dealloc"); // [super dealloc];s //} //-(void) push //{ //NSLog(@"Extented %@ push",_name); //} @end
PersonPP.h
#import <Foundation/Foundation.h> #import "Person.h" @interface Person(plus) -(void) punch; @end
PersonPP.m
#import "PersonPP.h" @implementation Person(plus) -(void) punch { NSLog(@"Person %@ punched",_name); } @end
main中调用
#pragma 分类:创建类的一个分支(扩展原类),可以访问原来类的公共变量,具有可继承性 Person *p=[Person new]; p->_name=@"Andy"; [p punch];//Person.h中无此方法,痛殴PersonPP.h扩展了Person类
(五)扩展类
类扩展与分类类似,类扩展只要扩展头文件即可,方法在原类中实现,还是以上述(四)中的Person类为例,语法为Person()
扩展头文件PersonExt.h
#import <Foundation/Foundation.h> #import "Person.h" @interface Person() { @public int _age; } -(void) push; @end
扩展头文件中,增加了push方法,所以在person.m中可以直接实现,见(四)中Person.m中注视掉的push方法
#pragma 类扩展 类名 +() //第一种扩展方法:新建头文件PersonExt.h,定义扩展方法,在Person.m中实现此方法,此时p1可访问PersonExt.h中的变量 Person *p1=[Person new]; p1->_name=@"Andy"; [p1 push]; //第er种扩展方法:将文件PersonExt.h内容直接写入Person.m中,并在Person.m中实现扩展方法,此时p1无法访问PersonExt.h中的变量
//-----------main.m----------------//
#import <UIKit/UIKit.h> #import "AppDelegate.h" #import "Student.h" #import "Person.h" #import "Worker.h" #import "PersonPP.h" #import "PersonExt.h" typedef int (^BlockDef)(int,int); int main(int argc, char * argv[]) { @autoreleasepool { #pragma 构造函数 Student *s=[ [Student alloc] initWithName:@"Andy" ID:@"01"]; [s showInfo]; #pragma 计数器(自动释放内存模式不做处理) //Person *p=[Person new]; //NSLog(@"Count:%lu",p.retainCount); //[p release]; #pragma block 类似C#中用lamd定义的委托 BlockDef sumBlock=^(int a,int b) { return a+b; }; NSLog(@"Block get sum:%d",sumBlock(1,2)); #pragma protocol 类似接口 Worker *w = [Worker new]; [w method1]; [w method1]; #pragma 分类:创建类的一个分支(扩展原类),可以访问原来类的公共变量,具有可继承性 Person *p=[Person new]; p->_name=@"Andy"; [p punch];//Person.h中无此方法,痛殴PersonPP.h扩展了Person类 #pragma 类扩展 类名 +() //第一种扩展方法:新建头文件PersonExt.h,定义扩展方法,在Person.m中实现此方法,此时p1可访问PersonExt.h中的变量 Person *p1=[Person new]; p1->_name=@"Andy"; [p1 push]; //第er种扩展方法:将文件PersonExt.h内容直接写入Person.m中,并在Person.m中实现扩展方法,此时p1无法访问PersonExt.h中的变量 return 0; //return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }