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]));
    }
}

猜你喜欢

转载自www.cnblogs.com/llstart-new0201/p/9610006.html