iphone开发Objective-C新特性──类别与协议
2012-10-14 00:07
447 查看
iphone开发Objective-C新特性──类别与协议
本文转自/article/7627311.html
本文将介绍Objective-C语言的新物性,其中类别(categories)允许在现有的类中添加用户自己的方法,而协议则是Objective-C语言中特有的一种继承方式,类似于java语言中的接口。下面我将首先介绍它们的作用,还将以自己在工程中的实例予以分析。一、类别
有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类。比如,当工程已经很大,代码量比较多,或者类中已经包住很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。
注意:类别只能扩充方法,而不能扩充成员变量。
实例分析:
1、目的:在我的工程中,我需要对图片进行压缩,此时我想到类别,利用类别对UIImage类进行扩展,增加图片压缩方法。
2、类别定义:
类别.h声明文件
#import <Foundation/Foundation.h>
@interface UIImage (UIImageExt)
//这个方法就是我添加的图片压缩的方法
- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize;
@end
类别.m实现文件
#import "UIImageExt.h"
@implementation UIImage (UIImageExt)
- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
UIImage *sourceImage =
self;
UIImage *newImage =
nil;
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor =
0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint =
CGPointMake(0.0,0.0);
if (CGSizeEqualToSize(imageSize, targetSize) ==
NO)
{
CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;
if (widthFactor > heightFactor)
scaleFactor = widthFactor;
// scale to fit height
else
scaleFactor = heightFactor;
// scale to fit width
scaledWidth= width * scaleFactor;
scaledHeight = height * scaleFactor;
// center the image
if (widthFactor > heightFactor)
{
thumbnailPoint.y = (targetHeight - scaledHeight) *
0.5;
}
else
if (widthFactor < heightFactor)
{
thumbnailPoint.x = (targetWidth - scaledWidth) *
0.5;
}
}
UIGraphicsBeginImageContext(targetSize);
// this will crop
CGRect thumbnailRect =
CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width= scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage
drawInRect:thumbnailRect];
newImage =
UIGraphicsGetImageFromCurrentImageContext();
if(newImage ==
nil)
NSLog(@"could not scale image");
//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}
@end
3、如何使用类别
在上文我已经对UIImage进行了扩展,下面如何将演示在我的工程中如何调用该方法:
//根据图片tag显示图片
-(void)showPhotoBySerialNumber:(int)imageTag;
{
//这个largeImageArray是NSMutableArray类型的,存放图片存储路径,根据路径得到UIImage
UIImage *img = [UIImage
imageWithContentsOfFile:[self.largeImageArray
objectAtIndex:imageTag]];
//MyScrollView是我自定义的ScrollView,目的是使ScrollView响应点击事件,关于如何自定义的ScrollView在以后的博客中,我将会阐述
MyScrollView *scrView = [[MyScrollView
alloc] initWithFrame:CGRectMake(340*imageTag,
0, 320, 480)];
scrView.host = self;
//这句就是调用了类别,通过UIImage实例对象,调用imageByScalingAndCroppingForSize:类别
scrView.image = [img
imageByScalingAndCroppingForSize:CGSizeMake(320.0,
480.0)];
scrView.tag = imageTag+100;
//下面这句,就是把上面的scrView塞到imageScrollView上,imageScrollView是UIScrollView类型
[self.imageScrollView
addSubview:scrView];
[scrView release];
}
二、协议
协议(protocol)类似于java语言里的接口(interface),定义了一组方法,而不提供具体实现,只有那些“遵守”(conform to)或“采用”(adopt)了这些Protocol的类来给出自己的实现。协议不是类本身,它们仅定义了其它对象有责任实现的接口。当在自己的类中实现协议的方法时,用户的类就是遵守这个协议的,协议声明的方法可以被任何一个类实现。
1、协议的语法结构如下:
@protocol ProtocolName //协议名
methodDeclaration; //方法名
@end
2、如何使用协议
而在类声明时,语法如下:
@interface
ClassName : ParentClassName< ProtocolName>
然后在该类的实现文件中,实现该协议的方法methodDeclaration
3、实例分析
下面以在我的工程项目中协议的使用方法,这里只要讲我自己定义的协议。
1)该实例的目的:使在ScrollView上面的UIImageView响应点击事件
2)协议定义:
在类的.h声明文件中定义协议
#import <Foundation/Foundation.h>
//协议ImageTouchDelegate
@protocol ImageTouchDelegate
//协议中声明的方法
-(void)imageTouch:(NSSet *)touches withEvent:(UIEvent *)event whichView:(id)imageView;
@end
@interface ImageTouchView :
UIImageView {
id<ImageTouchDelegate> delegate;
}
@property(nonatomic,assign)id<ImageTouchDelegate> delegate;
@end
该类的.m实现文件如下
#import "ImageTouchView.h"
@implementation ImageTouchView
@synthesize delegate;
-(id)initWithFrame:(CGRect)frame
{
if (self == [super
initWithFrame:frame])
{
[self
setUserInteractionEnabled:YES];
}
return
self;
}
-(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
{
return
YES;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[delegate
imageTouch:touches withEvent:event whichView:self];
}
@end
3)如何使用协议?
前面我已经定义了ImageTouchDelegate,那么如何使用该协议的方法呢?当某个类要采用该协议时,在类的声明中列出协议的名称即可,如果要采用多个协议时,在后面的尖括号中以逗号分隔,加入即可。当在类采用了该协议时,就要在除了.h文件中进行声明外,还必须在它的.m实现文件中对声明的协议中的方法进行实现。还以上述我们已经定义好的协议为例,演示在我的工程中如何实现该协议。
在我的类中,首先在.h声明文件中,采用协议ImageTouchDelegate
#import <UIKit/UIKit.h>
//引入定义协议ImageTouchDelegate的头文件
#import "ImageTouchView.h"
//把协议名放到父头后面的尖括号里面,如果有多个协议,用逗号分隔
@interface PhotoOnShotViewController : UIViewController<ImageTouchDelegate> {
}
@end
下面要在类的.m实现文件中实现该协议定义的方法
#import "PhotoOnShotViewController.h"
@implementation PhotoOnShotViewController
//实现协议中定义的方法,
-(void)imageTouch:(NSSet *)touches withEvent:(UIEvent *)event whichView:(id)imageView{
}
@end
类别与协议在IOS开发中应用很广,也很实用,有必要掌握它们!
相关文章推荐
- iphone开发Objective-C新特性──类别与协议(转)
- iphone开发Objective-C新特性──类别与协议
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
- [置顶] Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明
- Objective-C /iphone开发基础:分类(category,又称类别)
- Objective-C ,ios,iphone开发基础:协议(protocol)
- Objective-C,ios,iphone开发基础:分类(category,又称类别)
- Objective-C /iphone开发基础:协议(protocol)
- Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明
- [置顶] Objective-C,/,ios,/iphone开发基础:分类(category,又称类别)
- iPhone开发:浅析Objective-C的动态特性
- [iphone开发]Objective-C学习笔记: Objective-C 语言特性
- Objective-C ,ios,iphone开发基础:Category(分类,类别,范畴) ,UINavigationBar设置背景图片适配
- [置顶] Objective-C ,/,ios,/iphone开发基础:协议(protocol)
- 【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体
- IPHONE开发基础概念--Cocoa、Foundation、UIKit、Objective-c、XCode、Interface Builder的概念
- iPhone开发视频教程 Objective-C部分 (51课时)
- iPhone开发视频教程 Objective-C部分 (51课时)
- iPhone开发入门之Objective-C语法快速参考