我想知道如何才能做一件我一直在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
可能会更好?等) -
id
比NSObject *
更通用,在大多数情况下你更喜欢使用它,查看这篇博客文章了解更多信息 - 实例变量是objective-C对象默认是
nil
,所以你可以检查你的-addObject:
的持有人值,并在需要时惰性初始化它。否则,您可以简单地在-init
方法中初始化holder
——这相当于Java 中的构造函数。 - 你必须在
-dealloc
方法中释放holder数组 - 你可以考虑像
-addObjects:(NSArray *)objs
这样的方法,它可以帮助你避免迭代数组和逐个添加对象