• 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]));
        }
    }
  • 相关阅读:
    采购申请 POCIRM-001:ORA-01403: 未找到任何数据
    前后端交互技术有哪些
    React实现类似淘宝tab居中切换效果
    CSS通过text-transform实现大写、小写和首字母大写转换
    从浏览器内部运行机制看性能优化
    设置网页浏览器标签小图标
    前后端分离的优缺点
    修改input搜索框默认叉号的样式为自定义图片
    编写优秀CSS代码的8个策略
    css如何设置不可复制?
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/9610006.html
Copyright © 2020-2023  润新知