【发布时间】:2011-01-23 04:01:44
【问题描述】:
如何在 Objective-c 中将类中的单个方法设为私有?
【问题讨论】:
标签: objective-c private
如何在 Objective-c 中将类中的单个方法设为私有?
【问题讨论】:
标签: objective-c private
Objective-C 中没有私有方法的概念。但是,您可以做的是在头文件中忽略该方法并在私有文件中添加一个类别。
通常是这样的:
@interface MyObject : NSObject {
// ivars
}
// public methods
@end
// usually in a seperate file
@interface MyObject ()
// private methods
@end
类别的空名称意味着它是class extension,这告诉编译器在主实现块中需要该方法。
【讨论】:
严格来说,你不能在 Objective-C 中创建私有方法;但您可以在包含实现 (MyClass.m) 的文件中创建一个类别,将其隐藏在头文件 (MyClass.h) 中。
//MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
}
@end
实现文件:
//MyClass.m
@interface MyClass ()
- (void)myPrivateMethod;
@end
@implementation MyClass
- (void)myPrivateMethod {
return;
}
@end
【讨论】:
Objective-C 在设计上不支持原生方法。
但是,您可以通过使用“类扩展”(匿名类别)来实现私有方法控制。
基本思想是在你的类的实现文件(不是它的头文件)内,但在你的@implementation 块之外,用你的私有方法声明一个类扩展。然后您可以实现这些方法,并且没有外部类能够看到它们。像这样:
@interface MyClass ()
- (void)myPrivateMethod;
@end
@implementation MyClass
- (void)myPrivateMethod
{
//implementation goes here
}
-(void)someOtherMethod
{
[self myPrivateMethod];
}
@end
使用类扩展会强制您实现主 @implementation 块中的方法,并要求实现它们(就像它们在标题中的主 @interface 块中声明一样)。
不幸的是,由于 Objective-C 的动态特性,这实际上不会阻止这些方法被其他类调用。他们将收到一个警告,告诉他们该类可能不会响应该消息,但在运行时它会起作用。这给您的唯一好处是能够对其他程序员隐藏这些方法。
【讨论】:
你不能。只有实例变量可以标记为私有。
虽然有一些方法可以做一些与私有方法等效的事情。 一般的想法是,您不在标头中而是在实现文件中声明私有方法。
因此,如果您想要一个公共 (myPublicMethod) 和私有 (myPrivateMethod) 方法,您的标头可能如下所示:
@interface MyClass {
}
- (void)myPublicMethod;
@end
然后你的实现文件有三个选项:
1.
不要在任何@interface 部分中声明该方法,只需确保它在@implementation 部分中使用之前已实现。
@implementation MyClass
- (void)myPrivateMethod { }
- (void)myPublicMethod {
[self myPrivateMethod];
}
@end
2.
在您的实现文件中使用匿名类别来声明私有方法并在主@implementation 块中实现它们。
@interface MyClass ()
- (void)myPrivateMethod;
@end
@implementation MyClass
- (void)myPrivateMethod { }
- (void)myPublicMethod {
[self myPrivateMethod];
}
@end
3.
在您的实现文件中使用常规类别并在单独的@implementation 块中实现私有方法。
@interface MyClass (PrivateMethods)
- (void)myPrivateMethod;
@end
@implementation MyClass (PrivateMethods)
- (void)myPrivateMethod { }
@end
@implementation MyClass
- (void)myPublicMethod {
[self myPrivateMethod];
}
@end
【讨论】: