1

我正在尝试编写一个可可触摸静态库。为了简单起见,我不想在我的接口文件中使用私有变量。现在的代码如下所示:

接口文件(myView.h):

@interface myView: UIView {

NSTimer * myTimer;

}

@end

实现文件(myView.h)

@implementation myView

@end

这个 NSTimer 指针只是一个私有变量,所以我尝试了这个:( 不工作)

接口文件(myView.h):

@interface myView: UIView {

}

@end

实现文件(myView.h)

NSTimer * myTimer;

@implementation myView

@end

它似乎有效,但事实证明计时器现在是一个静态变量。

我做错了什么还是没有解决方案?

4

3 回答 3

2

您不能在实现文件中定义实例变量。

一种可能的解决方案是拥有一个包含私有变量的私有结构,并有一个公开声明的私有变量指向这个私有结构:

@interface MyView {
   void *privateData;
}

实现文件:

typedef struct {
   NSTimer *myTimer;
}  PrivateData;


@implementation MyView()

@property (readonly) PrivateData *privateData;

@end


@implementation MyView

- (id) init {
   if (self = [super init]) {
       privateData = malloc(sizeof(PrivateData));

       self.privateData->myTimer = nil; // or something else
   } 

   return self;
}

-(PrivateData *) privateData {
    return (PrivateData *) self->privateData;
}

- (void) myMethod {
   NSTimer *timer = self.privateData->myTimer;
}

- (void) dealloc {
    // release stuff inside PrivateData
    free(privateData);
    [super dealloc];
}

@end

它不漂亮,但它有效。也许有更好的解决方案。

于 2009-09-24T10:44:15.243 回答
1

只是一个注释;为了安全而试图隐藏 iVar 是愚蠢的。不要打扰。

不过,为了简单起见,它是有价值的。

但是,有几个解决方案:

(1) 如果针对 iPhone OS 或 64 位 Cocoa,您可以@synthesize ivar:

富.h:

@interface Foo:NSObject
@property(readwrite, copy) NSString *publiclyReadwriteNoiVar;
@property(readonly, copy) NSString *publiclyReadonlyPrivatelyReadwriteNoiVar;
@end

Foo.m:

@interface Foo()
@property(readwrite, copy) NSString *privateProperty;
@end

@implementation Foo
@synthesize publiclyReadwriteNoiVar, publiclyReadonlyPrivatelyReadwriteNoiVar, privateProperty;
@end

(2) 使用类似于类集群的私有子类:

富.h:

@interface Foo:NSObject
@end

Foo.m:

@interface RealFoo:Foo
{
    .... ivars here ....
}
@end
@implementation RealFoo
@end

@implementation Foo
+ (Foo *) convenienceMethodThatCreatesFoo
{
   .... realFoo = [[RealFoo alloc] init]; ....
   return realFoo;
}
@end
于 2009-09-24T15:31:55.660 回答
1

根据封装的目标,还有 @private 指令:

访问修饰符

于 2009-09-24T15:42:15.217 回答