Objective-C 添加私有方法
2014-04-11 18:31
239 查看
在面向对象的开发中,一个很重要的原则就是不要暴露不需要暴露的东西。 在Objective-C中,在头文件中你只能声明类方法和实例方法,这意味着你所有的方法都要暴露在外边。
其实在Objective-C中也可以来声明一个私有方法,这个方法只有本类可见,其他任何类都看不到,即使是继承于这个类的其他子类也无法看到。 方法也比较简单。
类目(Category):
类目是Objective-C中最有用的一个特性。实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。
这是特别有用的,因为你可以给一个内建的对象添加方法。当你想在你的应用程序里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通过定义一个子类来添加该方法。
比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:
#import <Cocoa/Cocoa.h>
@interface NSString (Utilities)
- (BOOL) isURL;
@end
这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的事。
下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目的概念。
#import "NSString-Utilities.h"
@implementation NSString (Utilities)
- (BOOL) isURL
{
if ( [self hasPrefix:@"http://"] )
return YES;
else
return NO;
}
@end
现在,你可以使用NSString的这个方法了,下面的代码会在控制台打印“string1 is a URL”:
NSString* string1 = @"http://pixar.com/";
NSString* string2 = @"Pixar";
if ( [string1 isURL] )
NSLog (@"string1 is a URL");
if ( [string2 isURL] )
NSLog (@"string2 is a URL");
与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)类中已经存在的方法,当然,重写的时候要特别小心。
记住,当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这个类的实例。
@interface Controller (Private),此处的Private可以是任意的,只要实现下面二者一致即可。
@interface Controller (xxx)
@implementationController (xxx)
其实在Objective-C中也可以来声明一个私有方法,这个方法只有本类可见,其他任何类都看不到,即使是继承于这个类的其他子类也无法看到。 方法也比较简单。
@interface Controller : NSObject { NSString *something; } + (void)thisIsAStaticMethod; - (void)thisIsAnInstanceMethod; @end @interface Controller (Private) - (void)thisIsAPrivateMethod; @end只要在头文件或者实现类里面添加一个interface,这个Interface的名字跟头文件里面的一样,只是后面加上了(Private)。现在在这个interface中声明的方法就是私有方法了。
类目(Category):
类目是Objective-C中最有用的一个特性。实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。
这是特别有用的,因为你可以给一个内建的对象添加方法。当你想在你的应用程序里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通过定义一个子类来添加该方法。
比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:
#import <Cocoa/Cocoa.h>
@interface NSString (Utilities)
- (BOOL) isURL;
@end
这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的事。
下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目的概念。
#import "NSString-Utilities.h"
@implementation NSString (Utilities)
- (BOOL) isURL
{
if ( [self hasPrefix:@"http://"] )
return YES;
else
return NO;
}
@end
现在,你可以使用NSString的这个方法了,下面的代码会在控制台打印“string1 is a URL”:
NSString* string1 = @"http://pixar.com/";
NSString* string2 = @"Pixar";
if ( [string1 isURL] )
NSLog (@"string1 is a URL");
if ( [string2 isURL] )
NSLog (@"string2 is a URL");
与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)类中已经存在的方法,当然,重写的时候要特别小心。
记住,当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这个类的实例。
@interface Controller (Private),此处的Private可以是任意的,只要实现下面二者一致即可。
@interface Controller (xxx)
@implementationController (xxx)
相关文章推荐
- Objective-c - 私有属性和私有方法的应用
- Objective-C用关键字interface实现私有方法
- C# 为私有方法添加单元测试(反射)
- Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法
- objective-c声明私有方法
- Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法(3)
- Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法
- Objective-C类-为分数类添加最大公约数方法
- Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法(1)
- 小N的白盒测试之路 — objective-c私有成员和私有方法的测试
- [Objective-C] 为什么Objective-C不支持类的私有方法
- Objective-C私有方法和类目
- objective-c 定义私有方法
- Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法
- Objective-C 2.0 with Cocoa Foundation--- 8,类方法以及私有方法(1)
- C# 为私有方法添加单元测试
- [Objective-C] 使用Category给类添加private方法
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
- Objective-C 私有变量和私有方法如何实现?
- oc 在Appdelegate添加私有方法和属性