`
was0107
  • 浏览: 7556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Objective-C学习之路 委托模式

    博客分类:
  • Mac
 
阅读更多
Objective-C学习之路 委托模式http://blog.csdn.net/mac_cm/article/details/6638167

objective-c与C++的区别
Objective-C,是在C的基础上,加入面向对象特性扩充而成的编程语言。Objective-C主要应用於Mac OS X和iOS 系统,可以在任何gcc支持的平台上进行编译,因为gcc原生支持Objective-C。
程序例子:
#import<Foundation/Foundation.h>
int main(int argc, char *argv[]){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Hello World!");
[pool drain];
return 0;
}
--
C++ 是在C基础上加了class 等新东西而成的编程语言,可以把C看成是C++的一部分。可以用它写面向对象的程序,也可以写以过程为主的程序。C++ 已得到广泛(远比objective-c广泛)应用,用于各种平台。
--
Objective-C 不用“函数调用”,而用互相传递讯息。
Objective-C 类分为Interface和implementation两块。
Objective-C 构建对象 分为两块 alloc (内存分配)以及init(初始化)
Objective-C 协议分为非正式协议和正式协议




与C语言相比要注意的地方

objective-c高级特性
开发工具介绍(cocoa 工具包的功能,框架,源文件组织;XCode使用介绍)

简介:
1.       objective-c是C语言的一个扩展集,主要由APPLE公司维护,是MAC系统下的主要开发语言。个人认为,对于用惯了常用的C,JAVA等语言的人来说,objective-c是一中很另类,非主流的语言。

2.    开发 Mac的 UI 程序来说,使用的是 Cocoa 这个框架,cocoa的组成部分有:foundation和application kit框架。
【foundation框架处理用户界面之下的特性,如数据结构和通信机制;application kit框架包含cocoa的高级特性:用户界面元素,打印,颜色,声音管理,applescript等】
与C语言相比要注意的地方:

1.       文件介绍:Objective-C 也使用头文件(header files),后缀为 .h, 但使用 .m(即 message, 其他面向对象编程语言也叫 method),作为源文件的后缀。
在objective-c中使用#import<>,而不使用#include<>,#import可以保证头文件只被包含一次。

2.       与C一致的地方:

数据类型,表达式,各种运算符
循环:for, while, do while, break, continue
分支:if, else, switch

3.    NSlog()函数:与printf()类似,想控制台输出信息。但它增加了一些特性,如时间戳等。
【cocoa对起所有的函数,常量和类型名称都添加了NS前缀。】

4.       双引号的前面的@表示这双引号中的字符串应该作为cocoa的NSString元素来处理。

5.       布尔类型BOOL:值为YES,NO;

6.    %d表示输出整数
  %@表示输出NSString类型
%s表示输出字符串数组(char*);

7.    objective-c中的方括号:
1.       用于通知某个对象该做什么。
2.       方括号内第一项是对象,其余部分是你需要对象执行的操作。
3.       在objective-c中通知对象执行某种操作,称为发送消息。(也叫调用方法)

8. 标识符id:是一种泛型,用于表示任何种类的对象。

9. 类声明@interface:
 
@interface Circle:NSObject   //为Circle类定义接口;NSObject表示是父类。
{//以下是数据成员

   ShapeColor fillColor;
   ShapeRect bounds;

}

//以下是方法声明
-(void) setFillColor: (ShapeColor) fillColor;  //前面的短线表明这是方法声明

                                   //短线后面是方法的返回类型

                                   //接着是方法名

//冒号后面是参数,其中(ShapeColor)是参数类型,

fillColor是参数名

-(void) setBounds:(ShapeRect) bounds;

-(void) draw;

//减号就是普通函数
加号就是静态函数
@end     //结束声明

objective-c看到@符号,就把它看成是C语言的扩展。
一个类的完整声明如下:

    @interface CClassA(Category): CBaseClass<IA,IB...>

//类名(类别名):父类<协议>


10. 类实现@implementation

@implementation

@implementation Circle

-(void) setFillColor: (ShapeColor) c

{

   fillColor=c;

}

-(void) draw

{

    NSLog(@”drawing a circle at(%d %d %d %d) in %@”, bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillName));

}

@end

隐藏对象self对应于C中的this。
Self->fillcolor来访问成员变量。


11. 调用写好的类和类函数:

//创建新对象,使用缺省初始化函数

    Bank *bankDefault = [[Bank alloc] init];

//调用方法:

    [bank addAmount: 1];

[bank print];

// 释放对象:

    [bankDefault free];



12.

两个参数的方法:

-(void) setTire: (Tire *) tire  //声明

      atIndex: (int) index;

//使用

[car setTire:tire atIndex:2];


objective-c高级特性:

1.       继承

Objective-c不支持多继承。

Super 关键字:调用该类的父类;

超类:父类的另一种说法。



2.       

自定义NSLog()输出:

在类中添加description方法就可以自定义NSLog()如何输出对象。

@implementation Tire

-(NSString *) description

{

   Return (@”I am a tire.”);

}

Main()

{

    NSLog(@”%@”,tire[0]);

}


3.       

Foundation kit:
Cocoa是由两部分框架组成的:foundation kit [包括一些基础类]和 application kit.【包括用户接口对象和高级类】

创建字符串:

NSString *test;

test=[NSString stringWithFormat:@"i'm %d years old!",23];

若在声明方法时在方法前面添加了加号,那就表示把这个方法定义为类方法【这个方法属于类对象,而不是类的实例对象。】

NSArray类:可以存放任意类型的对象.
它有两个限制:

1. 它只能存储objective-c的对象,但不能存储C中的基本数据类型,如int , float, enum, struct等。

2.不能存储nil(对象的零值或NULL值);【因为在创建NSArray时,要在列表结尾添加nil代表列表结束。】

创建NSArray:

NSArray *array;

array=[NSArray arrayWithObjects:@"one",@"two",nil];       

NSString, NSMutableString类;

【NSString是不可变的,即一旦创建完成,就不能通过删除字符或添加字符的方式来改变它;
而NSMutableString是可变的。
这两个类就像JAVA中的string与stringBuffer类的区别。】
NSArray, NSMutableArray类;

NSEnumerator枚举;



NSEnumerator *emun;

Emun=[array objectEnumerator];

Id thingie;

While(thingie=[enumerator nextObject]){}



NSDictionary:字典(关键字及其定义的集合。)【也成为散列表,关联数组】,NSMutableDictionary类;

NSNumber:用来包装基本数据类型,如int ,char, float, bool;【将一个基本类型的数据包装成对象叫做装箱。】

NSValue:它可以包装任何类,NSNumber是它的子类。
NSNull:

在cocoa中看到“CF”字样时,就表示它是苹果公司的Core Foundation 框架相关的内容。
NSAutoreleasePool:自动释放内存池。

 

4.       

内存管理

每个对象都有一个与之关联的引用计数(也叫保留计数)
当使用alloc, new 方法或通过 copy消息(生成接收对象的一个副本)创建一个对象时,对象的引用计数值被设为1;

给对象发retain消息时,增加该值;

发送release消息时,减少该值;

当一个对象的引用计数值变为0时,objective-c会自动向对象发送一条dealloc消息。销毁该对象。

你可以在自己的对象中重写该方法,

使用retainCount消息,可以获取引用计数器的值。

-(id) retain;

-(void) release;

-(unsigned) retainCount;   

自动释放池:autorelease pool;

创建:

NSAutoreleasePool *pool;

pool=[[NSAutoreleasePool alloc] init];

销毁:

[pool release];

注意:xcode自动生成的代码,销毁pool池时,使用的是[pool drain],drain方法只是清空释放池,但不销毁pool.所以在自己编写代码时还是使用release.

而且,drain只适用于MAC OS 10.4以上的版本,而release适用于所有版本。

只有在向某个对象发送autorelease消息时,该对象才会添加到NSAutoreleasepool中,才会被自动释放。

如:[car autorelease];

内存管理黄金准则:
只有通过alloc, new和 copy方法创建的对象,才需要程序员负责向该对象发送release或autorelease消息。

而通过其他方法获得的对象,则默认为已经被设置为自动释放,所以不需要程序员做任何操作了。

在objective-c 2.0中有垃圾回收机制,
如果要对某个项目使用垃圾回收:

项目信息--build选项卡--查询"garb",出现“objective-c Garbage Collection”,将其值设置为“required[-fobjc-gc-only]”

启用垃圾回收后,通常的内存管理命令全都变成了空操作指令,不执行任何操作。

开发iphone软件,不能使用垃圾回收。

 

5.       

对象初始化

两种创建新对象的方法:

[类名 new]

[[类名 alloc] init]

这两种方法是等价的,但cocoa的惯例是使用后者。

alloc在为对象分配空间的同时,将这块内存初始化为0;

Init方法:初始化实例变量,使对象处于可用状态。[返回类型为id,  返回的值描述了被初始化的对象]

使用new创建新对象时,系统要完成两个步骤:

1.       为对象分配内存,即对象获得一个用来存放其实例变量的内存块;

2.       自动调用init方法,让该对象处于可用状态。

 
 

6.    

objective-c 2.0的新特性【只适用于mac os x10.5及以上】

@property :表示声明了对象的属性。【这样就不用再写属性的访问器了。】

(他有copy, retain, readwrite, readonly等属性)

@synthesize:表示“创建该属性的访问器”

点表达式

 
 

7.    

类别

类别(category)是一种为现有的类添加新方法的方式。

类别的声明:

@interface NSString (NumberConvenience) //类名 (类别名)

-(NSNumber) lengthAsNumber;            //扩充方法声明

@end

使用时使用原来的类名,就可以调用他的所有类别中的方法。

类别的局限性:

1.    不能向类中添加新的实例变量;

2.    在类别中的方法若与类中现有的方法重名,则类中的方法不可用,被类别中的新方法取代。

类别的作用:

1.    将类的实现分散到多个文件或框架中;

2.    创建对私有方法的前向引用;

【Cocoa中没有真正的私有方法,则实现私有方法类似功能的方法为:

先在类别中声明方法;然后到现有类的实现中实现该方法。

这样这个类中的其他方法可以使用该方法,而其他外部的类就不会知道该方法的存在了。】

3.    向对象添加非正式协议。
【创建一个NSObject的类别称为创建一个非正式协议。】

委托delegate是一种对象,另一个类的对象会要求委托对象执行它的某些操作。

受委托对象在某个时间(某个事件触发)时,会自动通知委托对象执行委托方法。

选择器:@selector():选择器只是一个方法名称,但它以objective-c运行时使用的特殊方式编码,以快速执行查询。圆括号中的内容是方法名。

所以Car类的setEngine:方法的选择器是:@selector(setEngine:

受委托对象如何知道其委托对象是否能处理它(受委托对象)发送给它(委托对象)的消息?

通过选择器,受委托对象先检查委托对象,询问其是否能响应该选择器。如果能,则向它发送消息。



8.    

协议:

正式协议是一个命名的方法列表。

采用协议意味着必须实现该协议的所有方法。否则,编译器会发出警告。

正式协议就像JAVA中的接口一样。

声明协议:

@protocal NSCopying

-(id) copywithzone:(NSZone *) zone; //方法列表

@end

采用协议:

@interface Car:NSObject <NSCopying,NSCoding> //中括号中是要实现的协议列表

{//实例变量列表}

//方法列表

@end

在objective-c 2.0中,有新特性:@optional, @required


9.    

AppKit:

创建APPKIT项目:

File—new project—mac os—application—Cocoa application;

IBOutlet与IBAction

这两个都是APPKIT提供的#defines.

IBOutlet没有任何作用,不会对它进行编译。

IBAction定义为void。

这两个是为Interface Builder以及阅读代码的人提供的标记。

.xib文件一般称为.nib文件。

.nib文件是包含被冻结对象的二进制文件。

而.xib文件是XML格式的nib文件。
分享到:
评论

相关推荐

    Objective-C编程之道IOS设计模式解析pdf文档及源码

    Objective-C编程之道IOS设计模式解析pdf文档及源码,精心整理全套

    Objective-C委托的例子程序

    一个演示如何使用Objective-C中协议和委托的例子程序,使用到了单例、观察者等设计模式。

    Google Objective-C Style Guide 中文版

    Google Objective-C Style Guide 中文版 目录 例子 空格与格式 空格与制表符 行宽 方法声明与定义 方法调用 @public与@private 异常 ...Objective-C++ ...Objective-C方法名 ...委托模式 模型-视图-控制器

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码《Objective-C编程之道:iOS设计模式解析》是基于iOS的软件开发指南。书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,...

    Using Swift with Cocoa and Objective-C完整中文CocoaChina精校版

    Objective Objective Objective Objective-C选择器 选择器 (Selectors)(Selectors)(Selectors) (Selectors)(Selectors)(Selectors)(Selectors) 15 2.2. 2.2. 使用 Objective Objective Objective Objective-C特性...

    UsingDelegates:iOS Objective-C,实现委托设计模式

    委托设计模式的解释和实现 问:1什么是委托设计模式? 答:1“委派是一种简单而强大的模式,其中应用程序中的一个对象代表另一个对象或与另一个对象协同工作。委派对象在适当的时候保留对另一个对象(委托)的引用...

    iosStudy:Objective-C和iOS研究

    iosStudy1_UIViewExample UIView UIImageView ViewController2_ProtocolDelegateExample @协议委托模式@property弱属性(保留周期问题)3_TableViewExample UITableView UITableViewCell UITableViewDataSource ...

    iPhone应用开发从入门到精通代码

    C语言与C++混用975.4 本章小结985.5 本章练习98第6章 iPhone程序的设计模式996.1 MVC模式996.2 对象共享模式1016.3 目标和动作模式1046.4 通告模式1056.5 归档模式1076.6 子视图模式1086.7 委托模式1106.8...

    HysteriaPlayer:Objective-C音频播放器,位于AVPlayer之上

    用很少的块设置HysteriaPlayer,在UIView和UIViewController子类中实现委托,以在播放器事件发生更改时更新UI。 能够推进下一个/上一个项目。 如果播放器由于缓冲问题而暂停播放,请在缓冲大小达到5秒后自动恢复...

    cocoa基本原理指南

    2. "Cocoa对象" 解释Objective-C的基本用法和优点,以及 Cocoa对象的常见行为、接口、和生命周期。 3. "为Cocoa程序添加行为" 描述如何使用Cocoa框架来编写程 序,解释如何创建一个子类。 4. "Cocoa的设计模式" 描述...

    block-party:乐高委托模式。 阻止 FTW!

    乐高委托模式。 去授权化 使用 Block Party 将所有委托回调替换为块(或者只是一些 - 在所有情况下仍会触发委托回调)。 核心蓝牙(CBCentralManager、CBPeripheral 和 CBPeripheralManager) 外设管理器 [ self ....

    Cocoa基本原理指南(2010年4月16日).zip

    2. "Cocoa对象" 解释Objective-C的基本用法和优点,以及 Cocoa对象的常见行为、接口、和生命周期。 3. "为Cocoa程序添加行为" 描述如何使用Cocoa框架来编写程 序,解释如何创建一个子类。 4. "Cocoa的设计模式" 描述...

    resume:我的在线简历

    较强的代码阅读能力和语言学习能力理解并能熟练运用iOS应用开发中常见设计模式,如:MVC、委托、广播、单例等熟练使用CocoaTouch基础框架:Foundation 、UIKit、CoreGraphics、AVFoundation、Mapkit等掌握Core Data...

    WebSockets开发包starscream.zip

    starscream 是使用 Swift 实现了 iOS 和 OS X 的 Websockets(RFC 6455)。 同时还有个 Objective-C 版本的:jetfire ... 简单的委托模式设计 TLS/WSS 支持 几百行简单的 LOC 代码 标签:starscream

    ua-aws-sdk-ios:适用于Amazon Web Services(AWS)的iOS SDK

    适用于iOS的AWS开发工具包(未签名的应用程序版本) 这是的到Objective-C的端口。 它旨在(最终)扩大对适用于iOS的正式AWS开发工具包的覆盖范围,并改进队列和块用于处理响应的用法。 注意:这是预发行软件,因此...

    LocationManager:在iOS上轻松获取设备的当前位置

    INTULocationManager可以轻松获取设备的当前位置,并且当前正在iOS上运行。 这是一个Objective-C... CLLocationManager使用更传统的委托模式,而不是现代的基于块的回调模式。 尽管跟踪用户位置随时间的变化效果很好

    WillzPlotz_iOS:来自 Yahoo! 的股票报价数据的简单图iOS 财务

    WillzPlotz - 获取股票价格并使用 CoreGraphics 进行可视化 这个项目演示了我用 Objective-C 开发的 iOS 数据可视化框架,称为 iViz。 该框架为折线图和条形图提供了基本视图控制器,可以使用委托协议模式对其进行...

    TwitterAPI封装Objectwitter-C.zip

    在 STTwitter 对 Twitter REST API 的全面封装的基础上,增添了很多工具类使得 API 更加抽象,易用,并且完全重新设计了 Twitter Streaming API 的封装,利用类似于 NSURLSession/NSURLConnection 的委托模式...

    驾校管理系统毕业设计源码-resume:恢复

    能够使用Objective-C、Swift进行iOS应用开发,了解C/C++,python 等编程语言 熟练使用Storyboard/Xib 进行界面设计和布局,使用AutoLayout进行屏幕适配,掌握各种UI控件的使用和自定义 掌握MVC,委托代理等常用设计...

    《iOS6开发指南》精彩书摘

    本书是智捷iOS课堂团队编写iOS系列丛书中的一本,目的是使一个有Objective-C基础的程序员通过本书的学习,能够从零基础到在App Store发布一款应用。全书分为4篇:  第一部分基础篇,介绍了iOS一些基础的知识。 第1...

Global site tag (gtag.js) - Google Analytics