Objective-C 接口编程

筅森魡賤 提交于 2020-01-07 04:27:17

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1. @Protocal (协议)

    @protocal 是Objective-C 中普遍存在的接口定义方式,即在一个类中通过@protocal 中定义接口,在另外的类中实现该接口,这种定义方式夜晨为"delegate"模式。@protocal 声明了可以被其他任何类实现的方法,协议仅仅是定义一个接口,由其他类区负责实现。

    "delegate"模式的使用共分为三个步骤:

        1)接口声明:创建 一个protocal 文件TestDelegate

            @protocal TestDelegate<NSObject>

            @required

                -(void)doSomething;

            @end            

        2)接口回调:定义一个类A,包含一个遵从此协议的属性CC,并定义一个方法用调用CC的方法,这样当实例化A的对象时,就可以通过delegate回调了。

            @interface  TestAppDelegate:NSObject

            {

                 id <TestDelegate> delegate;

            }

            @property (retain) id delegate;

            @end

            @implementation TestAppDelegate

            -(void)doSomethingWithProtocal

            {

               [self.delegate doSomething];

            }

            @end 

        3)借口实现:创建一个类B实现协议<TestDelegate>

            @interface  TestAppDelegate:NSObject<TestDelegate>

            @end

            @implementation TestAppDelegate

            -(void)doSomething

            {

                NSLog(@"call protocol method");

            }

            @end 

    注意:由于B的对象是A的delegate,则如果B要release了,则应该先将A的delegate置为nil,然后再releaseB的对象。

2. NSNotifications (通知)

    Notifications 是 iOS 提供的一种“同步的”消息通知机制,即消息在发送到下一个接收者之前需要前一个接收者快速返回,否则就是阻塞下一个接收者接收消息,所以对于长时间的消息处理,需要另外启动一个线程来单独处理消息接收后的任务,以确保消息接收到后可以立即返回。

    这种消息通知机制可以应用于任意事件和对象,具有广播的性质,消息发送发送者对消息接收者可以一无所知。观察者可以有多个,只要向消息中心注册即可接收其他对象发送的消息,当不需要接收消息时,需要向消息中心注销。

    这种消息广播机制时典型的“Observer”模式,应用这种模式需要5个步骤。

    1)定义消息

        //A.h        extern NSString * const NOTIFICATION_STR;

        //A.m       NSString * const NOTIFICATION_STR  = @"notificationStr";        

        或者在 工程的 myObjective-Prefix.pch 文件中定义

        #define  NOTIFICATION_STR  @"notificationStr"

    2)发送消息

        // A.m

        [[NSNOtificationCenter defaultCenter] postNotificationName: NOTIFICATION_STR object:nil];

        注意:这里的object 可以是你定义的一个对象,可以用来传值给消息接收者

        还有另外两种发送方式: 

[[NSNotificationCenter defaultCenter]postNotification:(NSNotification *)];

    [[NSNotificationCenter defaultCenter]postNotificationName:(NSString *) object:(id) userInfo:(NSDictionary *)];


    3)观察者注册

        //B.m         [[NSNOtificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:NOTIFICATION_STR object:nil];

    4)观察者处理消息

        //B.m   -(void)doSomething:(NSNotification *)notify

                    {

                        id obj = [notify object];

                        .........

                    }

    5)观察者注销

        // B.m          [[NSNOtificationCenter defaultCenter] removeObserver:self];

3. categories 

    Objective-C 并没有真正的似有方法,但是可以通过 Categories 编写私有方法和变量,使他们不暴露给使用者。这也可称作以静态库的形式将代码进行封装。使用有三个步骤:

    1)定义私有Categories

        //SomeClass + hidden.h

        @interface SomeClass (hidden)

        +(void)hiddenMethod;

        -(void)hiddenInstanceMethod;

        @end

    2)实现私有Categories

         //SomeClass + hidden.m

            +(void)hiddenMethod{........}

            -(void)hiddenInstanceMethod{........}

    3)主类调用私有方法

        // SomeClass.m

        @implemetation SomeClass

            -(void)doSomeThing

            {

                [self hiddenMethod];

                [instance hiddenInstanceMethod];

            }

        @end

附:其实常用的很多OC对象的方法都是 定义在 categories中的,如NSString除了 length 和 getCharaterAtIndex: 外基本上都是定义在categories中的。 NSData也一样 等。


4. @protocal 封装类

    在Obj-c中 categories 中同样可以实现 @protocal 定义的接口。这样就可以为接口提供封装类,在封装类中实现接口定义的功能,类扩展实现接口的语法。需要三个步骤:

    1)定义接口protocal

        @protocal SomeDelgate<NSObject>

        -(void)doSomething;

        @end

    2)定义类 和 遵从SomeDelegate协议的扩展类

        //SomeClass.h

        @interface SomeClass:NSObject

        @property (nonatomic,assign) id <SomeDelegate> delegate;

        @end

        //SomeClass + CategoriesClass.h

        #import SomeClass.h

        @interface SomeClass(CategoriesClass) <SomeDelegate>

        @end

        //SomeClass + CategoriesClass.m

        @implemetation SomeClass(CategoriesClass)

            -(void)doSomething

            {

                NSLog(@"categories implement  protocolMethod.");

            }

        @end

    3) 接口调用

        // SomeClass.m

         @implemetation SomeClass

            SomeClass *obj =  [[SomeClass alloc]init];

            [obj doSomething];

        @end

      








易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!