您的位置:首页 > 移动开发 > Objective-C

Objective-C 添加私有方法

2014-04-11 18:31 239 查看
在面向对象的开发中,一个很重要的原则就是不要暴露不需要暴露的东西。 在Objective-C中,在头文件中你只能声明类方法和实例方法,这意味着你所有的方法都要暴露在外边。

其实在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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: