2009-09-24 43 views
1

我想写一个可可触摸静态库。 为了保持简单,我不希望在我的界面文件中使用私有变量。 代码现在看起来是这样的:如何在ObjectiveC中将非静态变量从接口移动到实现?

接口文件(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 

似乎但是工作原来计时器现在是一个静态变量。

我做错了什么或有没有解决办法?

回答

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 

这不是漂亮,但它的工作原理。也许有更好的解决方案。

+0

这实在是太丑(+1)反正 – jantimon

+0

这应该被更新。您现在可以在您的实现(.m)文件中定义实例变量。 – mahboudz

+0

更新后的解决方案: '@implementation ClassName {//实例变量声明。 }' http://stackoverflow.com/questions/10407848/is-this-a-new-way-to-define-private-instance-variables-in-objective-c – smileham

1

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

为了简单起见,虽然它有价值。

然而,一对夫妇的解决方案:

(1)如果针对iPhone OS或64位可可,你可以@synthesize伊娃:

了foo.h:

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

富.M:

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

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

(2)使用专用子有点像类集群:

了foo.h:

@interface Foo:NSObject 
@end 

富。L:

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

@implementation Foo 
+ (Foo *) convenienceMethodThatCreatesFoo 
{ 
    .... realFoo = [[RealFoo alloc] init]; .... 
    return realFoo; 
} 
@end 
相关问题