objective-c类方法中的实例变量访问

时间:2011-10-22 08:48:02

标签: java objective-c instance-variables

我想知道我怎样才能做到我用Java做的事情。

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中我不能直接访问持有者,除非它是属性,所以我最终使用直接访问持有者。

1 个答案:

答案 0 :(得分: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的{​​{1}}返回void,因此从您的方法返回-addObject:确实没用,除非您想要一些特定的行为(比如避免数组中的重复 - 那么也许BOOL会更好吗?等等。)
  • NSSetid更通用,在大多数情况下,您更喜欢使用它,有关详细信息,请参阅this blog post
  • 作为Objective-C对象的实例变量默认为NSObject *,因此您可以在nil中检查持有者值,并在需要时懒惰地初始化它。否则,您只需在-addObject:方法中初始化holder - 这相当于Java中的构造函数
  • 您必须在-init方法
  • 中释放持有人数组
  • 您可以考虑像-dealloc这样的方法来帮助您避免遍历数组并逐个添加对象