2012-02-23 23 views
1

我想声明对其他类的方法有用的私有方法。如果我把一个(+)方法是可见的(不是私有的),并且如果我使用( - ),则会在运行时抛出一个错误。定义将由类方法使用的私有方法 - 目标C

@interface SomeClass 

+ (int) nameOfMethod; 

@end 

@implementation SomeClass(PrivateMethods) 

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

@end 

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

+3

我认为你需要在Objective-C中重新学习方法可见性:所有方法都是公共的。有许多方法可以混淆方法的存在,但如果实现方法,类将响应发送给它的消息。 '+'表示它是一个静态(或类)方法。 '-'意味着它是一个实例方法。两者都是公开的。 – 2012-02-23 20:55:52

+1

'+'符号表示类方法,与可见性无关。有菜单问题(和答案!)在这里处理类方法:http://stackoverflow.com/search?q=%5Bobjective-c%5D+class+method&submit=search – Monolo 2012-02-23 20:56:15

回答

0

您想使用类扩展。

在您的实现文件(.M),你会具备以下条件:

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

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

如果你想创建一个唯一的其他类方法使用的私有方法,可以尝试在该类别中实现的.m文件。

1

我觉得你会混淆。

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

这不是问题的答案。 – mydogisbox 2012-02-23 20:58:38

+1

我知道,但他需要知道它。我没有足够的观点来随处添加评论...所以我只能写一个答案。现在你减少了我的分数...... – Franck 2012-02-23 21:04:30

+0

如果你不能,那么你不应该滥用其他功能来做到这一点。 – mydogisbox 2012-02-23 21:05:46

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 
+1

请注意,从Xcode 4.3开始,如果您使用的是LLVM编译器,它可以稍后在同一个“@ implementation”块中查找方法,因此您通常不必在'@ interface'块中声明内部方法所有。 – 2012-02-23 21:31:04

0

你也可以使用sharedClasses所以你可以访问使用相同的变量私有方法和值

有你访问该类

我创建的类的私有方法它像NSObject的,所谓的“测试”

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] 

您可以随时随地访问您的类中,如果你保存一些信息是一样的

我希望它可以帮助你

1

似乎有大约知名度和什么+-意味着一些混乱。

+-的情况下,恰当地指定类别与实例方法。或者,在其他语言的术语,+ (void) foo相同static void foo()- (void) bar相同void bar()(例如,-是一个实例方法)。

关于知名度的问题;严格地说Objective-C不像其他语言那样具有公共,私人等概念。任何消息都可以发送给任何对象,即使它没有实现该方法。

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

@interface MyObject 

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

@end 

你会有执行(。M)为:

@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,它只在实现文件中定义,因此通常不可见。

+0

感谢您的解释和您的时间。 – Jhegs 2012-02-23 21:48:38