zoukankan      html  css  js  c++  java
  • iPhone App开发实战手册学习笔记(5)之IOS常用机制

    1 前言

    在IOS开发中,相信大家一定听说过委托,数据源,target,action等等,今天我们就来简单的学习一下这些内容。

    2 详述

    2.1 委托和数据源

    大家是否曾经有不知道如何去执行一项任务的时候?或许是修理一台洗碗机或者补一双袜子。你可以学者自己做,或者找人帮你完成你不懂的地方,这就是委托。

    委托(delegation)的设计模式,可以让你的程序实现系统类定义好的接口。其工作方式:把一个对象介绍给另一个可以回答任何问题的对象。通过分配一个delegate,你可以在代码定义相关的接口来相应请求或者状态的变化。

    如果我们的对象想要成为一个委托对象,它需要按照一定的协议来实现。协议好比是一个合同,许多在合同中的方法都是可选的,但是其他的方法是必须实现的。

    例如查看一个使用委托的类:UIPickerView控件--用来从滚动列表中选取值。

    查看UIPickerView类的文档,我们会发现实例变量以如下形式定义:

    @property(nonatomic,assign) id<UIPickerViewDataSource> dataSource; 

    这一声明说明,支持UIPickerViewDelegate协议的任何类(由id声明)都可以使用UIPickerView的委托。

    2.2 目标和操作

    而数据源则是需要显示的数据,作为委托,一个名为dataSource的实例变量必须在UIPickerViewDataSource协议中实现。

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

    在处理Cocoa Touch中的控件时候,当点击按钮,拖动滑块调节音量,这些元素需要通知应用程序中的其他部分,它的状态改变了。

    其通过的是 target-action设计模式。换句话说,为每个控件设置一个target对象,用来接受改变的通知。像委托一样,你可以选择任何的对象。

    和委托不同的地方在于,动作可以使对象定义的任何方法,只需要符合下面两个签名之一:

    -(IBAction)actionOne{

    }

    -(IBAction)actionTwo:(id)sender{

    }

    Interface Builder使用IBAction来确定代码中的动作。第二种形式包含一种参数,该参数是发起动作的对象。在处理动作的时候,sender可能会使用到。

    2.2.1 手动添加目标对象及方法

    在Cocoa Touch中的每一个控件都是UIController的子类,该类定义了一下的方法:

    -(void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

    该方法有三个参数,第一个是目标对象,用来接受事件活动通知。第二个是动作参数,该参数定义的消息将会发送到目标对象。第三个是controlEvents,用与指定触发执行动作的事件类型。

    例如:UIControlEventValueChanged和UIEventTouchUpInside。

    2.3 深入了解视图的生命周期

    文件中的方法用 IBAction,属性用 IBOutlet与IB(Interface Builder)关联,例如:

    @property(nonatomic,retain)IBOutlet UIButton *myButton;

    他们会与.xib文件相关联,她的前身是NIB文件,“NeXT Interface Builder”的缩写,因为现在新的xib文件是基于XML的,所以改为xib。

    NIB的加载机制使用访问器来设置这些实例方法变量,会使用内容存的对象来调用-setMyButton:方法。

    被加载的对象拥有你在IB中做的所有设置。如果你改变了视图的背景颜色,这一变化将会记录在内存中,兵器你的实例变量会去访问它。

    一个对象从NIB文件读取后,会发送一条-awakeFromNib消息,但是不能用于初始化信息在这个方法里面,因为此时视图还没有加载,UIVIew采用的是延迟加载技术,我们可以覆盖-viewDidLoad方法。

    Cocoa Touch不仅会延迟加载,还可以在内存不足的时候将其自动移除。框架知道哪些是当前显示的视图,并会安全回收哪些不可见的视图。做这个处理时,它会发送消息给视图控制器,让你知道呢那日不足了。

    -(void)didReceiveMemoryWarning 方法。

    如果我们的视图依赖于大缓存的信息或者其他易于重建的数据,那么didReceiveMemoryWarning方法使用来清除这些对象的很好方式。

    可以重写-viewDidUnload方法,设置我们的实例变量,让他们为空。

    -(void)viewDidUnload{

    self.myButton = nil;

    [super viewDidUnload];

    }

    这里有一个细节:-viewDidLoad和-viewDidUnload方法可以呗多次调用,从而避免了初始化只可执行一次的问题。

    不一定要使用NIB文件绘制图层,可以覆盖-loadView方法,然后用-addSubView:方法将他们添加到主视图中去。

    最后,由于NIB加载器会保留存储在内存中的接口对象,所以你还要做最后一件事:当试图控制器销毁时,需要释放这些视图。

    -(void)dealloc{

    [myButton release];

           [super dealloc];

    }

    3 结语

    以上是所有内容,希望对大家有所帮助。

  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3122915.html
Copyright © 2011-2022 走看看