定义将由类方法使用的私有方法 - 目标C.

时间:2012-02-23 20:46:06

标签: iphone objective-c ios ipad

我想声明对其他类方法有用的私有方法。如果我放一个(+)方法是可见的(不是私有的),如果我使用( - ),则会在运行时抛出错误。

@interface SomeClass

+ (int) nameOfMethod;

@end

@implementation SomeClass(PrivateMethods)

+ usefulMethod; // Works but is not private
- otherUsefulMethod; // Compile but throws a error in runtime.

@end

对不起,第二个区块是扩展类。

6 个答案:

答案 0 :(得分:1)

我认为你会混淆。

+ usefulMethod; // + means that it is a class method
- otherMethod; // - means that is an object method

答案 1 :(得分:1)

除了每个人所说的,你可以在@implementation中定义方法,但不要在@interface中声明它们。这样,它们只会在介绍点之后的实现文件中可见。在介绍点之上使用它们将发出编译器警告,但是会起作用。像这样:

@interface C
-(void)a;
-(void)b;
@end

@implementation C
-(void)a
{
    [self x]; //Warning, but works
}

-(void)x
{
    NSLog(@"Woohoo!");
}

-(void)b
{
    [self x]; //No warning
}
@end

答案 2 :(得分:1)

对于可见性以及+-的含义似乎存在一些混淆。

+-的情况下,这些只是适当地指定一个类与一个实例方法。或者,在其他语言的术语中,+ (void) foostatic void foo()相同,- (void) barvoid bar()相同(例如,-是实例方法)。

关于可见度;严格来说,Objective-C与其他语言一样没有公共,私有等概念。任何消息都可以发送到任何对象,即使它没有实现该方法。

但是,这并不意味着您无法从类的公共标头中隐藏方法的声明。所以,通常你会有一个头文件,如:

@interface MyObject

- (void) foo;
- (void) secretFoo;

@end 

你将实现(.m)as:

@implementation MyObject

- (void) foo {
  NSLog(@"OMG FOO!");
}

- (void) secretFoo{
  NSLog(@"WAT! Don't do that");
}

@end

现在,让我们说方法- (void) secretFoo,顾名思义,秘密。而且,你更喜欢不只是有人打电话给它。好吧,随着事情的定义,你的公共标题向全世界广播了这种秘密方法的存在。解决这个问题的方法是从公共标题中删除它:

@interface MyObject

- (void) foo;

@end 

现在,没有人(一般来说)会知道你的秘密方法。但是,有一个小问题......如果你试图调用你的secretMethod(通过正常方法)你会得到编译器警告甚至错误(取决于你是否使用ARC)。没有人想要不必要的警告,如果你使用ARC,这是一个完全禁止的......

警告或错误的原因是相同的,您将尝试调用secretFoo,但未定义此类方法。因此,您现在需要弄清楚如何定义该方法,但公共标头中。我这样做的方法是相应地修改实现文件:

@interface MyObject(Private)
- (void) secretFoo{
@end

@implementation MyObject

- (void) foo {
  NSLog(@"OMG FOO!");
}

- (void) secretFoo{
  NSLog(@"WAT! Don't do that");
}

@end

现在您已为自己定义了secretFoo方法(例如,没有警告或错误),但它并未向全世界广播。

尽管我使用了术语(Private),但我所做的只是实现了一个Category,一个只在实现文件中定义,因此通常不可见。

答案 3 :(得分:0)

您想要使用类扩展。

在您的实施文件(.m)中,您将拥有以下内容:

@interface SomeClass()
+(void)usefulMethod;
-(void)otherUsefulMethod;
@end

@implementation SomeClass
//... normal implementations, including from the class Extension
@end

答案 4 :(得分:0)

如果您尝试创建只有其他类方法使用的私有方法,请尝试将该类别放在实现.m文件中。

答案 5 :(得分:0)

您还可以使用sharedClasses,以便可以使用相同的变量和值访问该私有方法

然后你可以访问类

中的私有方法

我创建的类就像NSObject,名为“test”

static test *_obj;

@implementation test

+ (test *)sharedTest {
        @synchronized(self) {

            if (_obj == nil) {

                _obj = [[self alloc] init];

                // Allocate/initialize any member variables of the singleton class here
                //_obj.member = @"";
            }
        }
        return _obj;
    }

    - (void)private1 {

    }

当你像这样打电话时

[[test sharedTest] private1]

您可以访问课程中的任何地方,如果您存储的某些信息将是相同的

我希望它可以帮到你