如何编写只应在类本身内使用并能够访问ivars的方法

时间:2014-01-26 00:52:46

标签: objective-c c function methods

我有一个类,它有一些方法只能在类本身中使用。存在这些方法是因为我正在进行图形工作的三步过程,但我只希望类的实例访问这些计算的最终结果,简化示例:

#import <Foundation/Foundation.h>

@interface GraphicsWorld : NSObject

@property(nonatomic, strong) NSMutableArray *objects;
@property(nonatomic, strong) NSMutableArray *adjustedObjects

/* three methods I'll never use outside of this class

 I want to find a way to get replace these methods.
 */
-(void) calcTranslation;
-(void) calcRotation;
-(void) calcPerspective;

/* the one method I'll use outside of this class */
-(NSMutableArray *) getAdjustedObjects;

@end

我可以在我的实现之外定义c函数,但是他们将无法访问这些属性:

#import <Foundation/Foundation.h>
#import "GraphicsWorld.h"

void calcTranslation()
{
    // I'm useless because I can't access _objects.
}

void calcRotation()
{
    // Hey, me too.
}

void calcPerspective()
{
    // Wow, we have a lot in common.
}

@implementation GraphicsWorld

-(NSMutableArray *) getAdjustedObjects
{
    calcTranslation();
    calcRotation();
    calcPerspective();

    return adjustedObjects;
}

@end

3 个答案:

答案 0 :(得分:0)

  1. 制作带有参数和返回值的C风格函数(如图所示)。
  2. 制作私有的Objective-C风格的方法。
  3. @implementation文件中的.h部分外,您还可以在.m文件中添加一个私有文件。正如您在.h文件的@implementation中声明方法和属性一样,您也可以在.m中执行相同操作。

答案 1 :(得分:0)

除非我误解了你的问题,否则听起来你只是想隐藏你的方法不公开?如果是这样,只需从标题中删除它们即可。您不再需要在objc(Xcode)中预先声明方法。编译器现在只在内部找到它们。

答案 2 :(得分:0)

可以调用一个方法,无论它是声明为私有,还是不放入头文件中;由于Objective-C隐藏方法的性质很难。

隐藏函数要容易得多,只需声明它们static即可。要访问当前实例,您只需传入对它的引用 - 即具体是幕后的Objective-C。

例如:

void calcTranslation(GraphicsWorld *self)
{
    // Access properties, instance variables, call instance methods etc.
    // by referencing self. You *must* include self to reference an
    // instance variable, e.g. self->ivar, as this is not a method the
    // self-> part is not inferred.
}

并称之为:

-(NSMutableArray *) getAdjustedObjects
{
    calcTranslation(self);
    ...