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



我想知道如何才能做一件我一直在Java中做的事情。

public class ObjectHolder {
 private List<Object> holder;
 public ObjectHolder() {
  // initialize object holder...
 }
 public boolean addObject(Object obj) {
  // add object and return true/false
 }
}

这种方法的优点是不能直接操作holder。我试图理解这是如何在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中,我不能直接访问holder,除非它是一个属性,所以我最终使用直接访问holder。

你可以这样做:

. 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:返回空,所以从你的方法返回BOOL真的没有用,除非你想要一些特定的行为(如避免重复在数组-那么NSSet可能会更好?等)
  • idNSObject *更通用,在大多数情况下你更喜欢使用它,查看这篇博客文章了解更多信息
  • 实例变量是objective-C对象默认是nil,所以你可以检查你的-addObject:的持有人值,并在需要时惰性初始化它。否则,您可以简单地在-init方法中初始化holder——这相当于Java
  • 中的构造函数。
  • 你必须在-dealloc方法中释放holder数组
  • 你可以考虑像-addObjects:(NSArray *)objs这样的方法,它可以帮助你避免迭代数组和逐个添加对象

最新更新