如何在Objective-c中将类中的单个方法设置为私有?

时间:2010-03-03 11:32:38

标签: objective-c private

如何在Objective-c中将类中的单个方法设置为private?

4 个答案:

答案 0 :(得分:3)

Objective-C中没有私有方法的概念。但是,您可以做的是忽略头文件中的方法并在私有文件中添加类别。

通常情况如下:

@interface MyObject : NSObject {
   // ivars
}
// public methods
@end

// usually in a seperate file
@interface MyObject ()
// private methods
@end

类别的空名称意味着它是class extension,这告诉编译器主要实现块中需要该方法。

答案 1 :(得分:1)

你不能严格地说在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

答案 2 :(得分:1)

Objective-C本身并不支持设计的私有方法。

但是,您可以使用“类扩展”(匿名类别)来实现私有方法控制。

基本思想是在您的类(不是其标题)的实现文件中使用私有方法声明类扩展,但在@implementation块之外。然后,您可以实现这些方法,并且没有外部类可以看到它们。像这样:

@interface MyClass ()
    - (void)myPrivateMethod;
@end

@implementation MyClass
    - (void)myPrivateMethod
    {
        //implementation goes here
    }

    -(void)someOtherMethod
    {
        [self myPrivateMethod];
    }
@end

使用类扩展会强制您实现主@implementation块中的方法,并要求它们被实现(就像它们在标头的主@interface块中声明一样)。

不幸的是,由于Objective-C的动态特性,这实际上不会阻止其他类调用这些方法。他们会收到警告,告诉他们该类可能不会响应该消息,但在运行时它会起作用。这给你的唯一能力是隐藏其他程序员的方法。

答案 3 :(得分:0)

你做不到。只有实例变量可以标记为私有。

虽然有办法做一些与私人方法相当的东西。 一般的想法是,您不要在标头中声明私有方法,而是在实现文件中声明。

因此,如果您想要一个public(myPublicMethod)和private(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