2010-08-04 42 views
0

因此,我已經構建了幾個應用程序,現在正在嘗試構建一段iPhone代碼,其他人可以將它們放入其應用程序中。問題是如何從用戶隱藏對象類頭文件(.h)中的數據元素?如何隱藏分佈式代碼的變量

例如,不確定人們是否使用過medialets iPhone分析,但他們的.h沒有定義任何數據元素。它看起來像:

#import <UIKit/UIKit.h> 

@class CLLocationManager; 
@class CLLocation; 

@interface FlurryAPI : NSObject { 
} 

//miscellaneous function calls 
@end 

隨着該頭文件,它們也提供具有在它的一些數據元素的組件文件(.a)中。他們如何在對象的整個生命週期內維護這些數據元素,而無需在.h文件中聲明它們?

我不確定它是否重要,但.h文件僅用於創建單個對象,而不是同一類的多個對象(FlurryAPI)。

任何幫助將不勝感激。由於

回答

0

在我的頭文件我有:

@interface PublicClass : NSObject 
{ 
} 
- (void)theInt; 
@end 

在我的源文件我有:

@interface PrivateClass : PublicClass 
{ 
    int theInt; 
} 
- (id)initPrivate; 
@end; 

@implementation PublicClass 
- (int)theInt 
{ 
    return 0; // this won't get called 
} 
- (id)init 
{ 
    [self release]; 
    self = [[PrivateClass alloc] initPrivate]; 
    return self; 
} 
- (id)initPrivate 
{ 
    if ((self = [super init])) 
    { 
    } 
    return self; 
} 
@end 

@implementation PrivateClass 
- (int)theInt 
{ 
    return theInt; // this will get called 
} 
- (id)initPrivate 
{ 
    if ((self = [super initPrivate])) 
    { 
     theInt = 666; 
    } 
    return self; 
} 
@end 

我使用作爲的INT一個例子。添加其他變量以適應您的口味。

0

我建議您使用類別來隱藏方法。

.H

#import <Foundation/Foundation.h> 


@interface EncapsulationObject : NSObject { 

    @private 
    int value; 
    NSNumber *num; 
} 

- (void)display; 

@end 

.M

#import "EncapsulationObject.h" 

@interface EncapsulationObject() 

@property (nonatomic) int value; 
@property (nonatomic, retain) NSNumber *num; 

@end 


@implementation EncapsulationObject 

@synthesize value; 
@synthesize num; 

- (id)init { 

    if ((self == [super init])) { 

     value = 0; 
     num = [[NSNumber alloc] initWithInt:10]; 
    } 

    return self; 
} 

- (void)display { 

    NSLog(@"%d, %@", value, num); 
} 

- (void)dealloc { 

    [num release]; 

    [super dealloc]; 
} 

@end 

您不能訪問通過點符號的私有實例變量,但你仍然可以得到價值通過使用[anObject NUM]儘管編譯器會產生一個警告。這就是爲什麼我們的應用可以通過調用PRIVATE API而被Apple拒絕。