2011-10-22 75 views
0

我想知道我怎么能做到我总是用Java完成的一件事情。Objective-C类方法中的实例变量访问

public class ObjectHolder { 

private List<Object> holder; 

public ObjectHolder() { 
    // initialize object holder... 
} 

public boolean addObject(Object obj) { 
    // add object and return true/false 
} 

} 

这种方法的好处是持有人不能直接操作。 我试图理解这种情况在Objective-C来实现,尤其是我做了这个Objective-C类接口:

@interface ObjectHolder : NSObject { 
    NSMutableArray *holder; 
} 

+(ObjectHolder*)holderWithObjects:(NSArray*)objs; 
-(BOOL)addObject:(NSObject*)obj; 

@end 

但是,这是我的问题入手,特别是类方法holderWithObjects内:

+(ObjectHolder*)holderWithObjects:(NSArray*)objs { 
    ObjectHolder *oh = [[[ObjectHolder alloc] init] autorelease]; 
    oh->holder= // array initialization and retain 
    for(NSObject obj in objs) { 
     // add to holder array 
     [oh->holder addObject:obj]; 
    } 
    return oh; 
} 
  • 持有人是一个实例变量,如何避免在@property改造它,我知道有在Objective-C无“私”的概念,但我不希望开发者误解了正确使用班级(我希望这个概念很清楚)。
  • 在Java中有一个构造函数,我可以初始化属性,在Objective-C类中,这是最适合的地方吗?
  • 如果不使用@property如何管理内存释放?
  • 如果我没有使用@property,编译器会抱怨没有这样的变量
  • 在类方法holderWithObjects我不能直接访问持有者,除非它是一个属性,所以我最终使用直接访问持有者。

回答

0

你可以做到这一点,例如像这样:

.h文件中:

@interface ObjectHolder : NSObject { 
    NSMutableArray *holder; 
} 

+(ObjectHolder*)holderWithObjects:(NSArray*)objs; 
-(void)addObject:(id)obj; 

@end 

.m文件:

+ (ObjectHolder*)holderWithObjects:(NSArray*)objs { 
    ObjectHolder *oh = [[[ObjectHolder alloc] init] autorelease]; 
    for(id obj in objs) { 
     [oh addObject:obj]; 
    } 
    return oh; 
} 

- (void)addObject:(id)obj { 
    if (holder == nil) { 
     holder = [[NSMutableArray alloc] init]; 
    } 
    [holder addObject:obj]; 
} 

- (void)dealloc { 
    [holder release]; 
    [super dealloc]; 
} 

一些注意事项:

  • NSMutableArray-addObject:返回void,所以真的没有用从你的方法返回BOOL,除非你想要一些特定的行为(如避免重复在阵列中凯茨 - 那么也许NSSet会更好?等)
  • idNSObject *更一般的,在大多数情况下,你更愿意使用它,请参阅this blog post更多信息
  • 是客观-C的实例变量对象默认为nil,因此您可以检查您的-addObject:持有者的价值,并在需要时懒惰地初始化它。否则,你可以简单地-init方法初始化holder - 这是一个构造器的Java中的等价
  • 你必须释放夹具阵列中-dealloc方法
  • 你可以考虑像-addObjects:(NSArray *)objs的方法,这将有助于你避免通过迭代阵列和逐个添加对象