文档章节

Objective-C 接口编程

木木情深
 木木情深
发布于 2014/02/19 19:22
字数 945
阅读 94
收藏 0

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

      








© 著作权归作者所有

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
10 个学习iOS开发的最佳网站

Apple Learning Objective C Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTS...

xiahuawuyu
2012/11/09
0
2
Python 与其他语言交互--Rubicon

Rubicon 是连接 Python 和其他编程语言的工具集合。 Rubicon 库现在支持: Objective C Java Objective C Rubicon-ObjC 是 Python 和 Objective-C 的桥梁,支持 iOS 和 OS X,允许你: 使用 ...

叶秀兰
2015/05/29
3.7K
2
Objective-C教程:Objective-C类的定义

Objective-C是面向对象的编程语言,所以具备面向对象编程语言的共性即:支持可重用的数据和函数的封装体,也就是大家常说的类。那么类到底是什么呢?其实,类就是在结构体的基础上发展的产物...

蓝鸥iOS开发者
2013/02/25
0
0
Objective-C进化特性

Objective-C进化特性 [TOC] 毫无疑问,Objective-C (下称ObjC)在诞生三十年后,因为iOS系统在移动设备领域的制霸,迎来了近五年来一年一波的进化,这些新特性表明ObjC这个年事已高的语言,仍...

秋刀生鱼片
2016/06/17
0
0
从 C++ 到 Objective-C 的快速指南

简介 当我开始为iOS写代码的时候,我意识到,作为一个C++开发者,我必须花费更多的时间来弄清楚Objective-C中怪异的东西。这就是一个帮助C++专家的快速指南,能够使他们快速的掌握Apple的iOS...

oschina
2014/05/10
10.7K
30

没有更多内容

加载失败,请刷新页面

加载更多

JS 调用Angularjs 的方法

// 1. 获取 Controllerlet appElement = document.querySelector('[data-ng-controller=MessagesCtrl]');let scope = angular.element(appElement).scope();// 2. 调用方法scope.l......

Moks角木
24分钟前
0
0
dubbo+zookeeper与 eureka的区别

CAP CAP 原则指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得 在分布式架构里, P必须有 Zookeeper保证C P 当...

群星纪元
33分钟前
1
0
云计算之边缘计算大势所趋

如果说边缘计算是公同认定的目标,那么我们看到,不同类型的厂商基于自身的特点,会从不同的起点、沿着不同的路径,向这个目标奔跑。上次参加阿里云的一次活动,看到他们将边缘计算的厂商分成...

linuxCool
38分钟前
0
0
前端通过后端传过来的'\n' ,''等字符串换行失败问题

后台推送换行符 '\n' 或 '<br/>' 等字符串到前台不会换行 详细描述 后台逻辑处理返回String字符串,其中包含\n或<br/>等换行符号,但是前端渲染时候却并没有真正的换行 也尝试了大佬的各种 ...

下次用oschina
45分钟前
2
0
volatile能保证有序性吗?

在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。   volatile关键字禁止指令重排序有两层意思:   1)当程序执行到volatile变量的读操作或者写操作时...

无精疯
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部