在nsmutablearray iphone sdk中访问对象的属性

时间:2010-06-27 08:09:30

标签: iphone nsmutablearray

在我的应用中,我有一个nsmutablearray,它存储了许多类型的对象。所有这些对象都有两个相似的属性:id,type。

我正在做的是我在1元素数组中获取当前工作对象并访问其属性id,从另一个类中输入。此类不知道哪个类型的对象是当前对象。我该如何访问这个对象?

我尝试过:

commentId = [[appDelegate.currentDeailedObject valueForKey:@"id"] intValue];
commentType = [appDelegate.currentDeailedObject valueForKey:@"type"];

但它不起作用。

我创建了一个类型为id的对象:

id *anObject = [appDelegate.currentDeailedObject objectAtIndex:0];
commentId = [[anObject valueForKey:@"id"] intValue];
commentType = [anObject valueForKey:@"type"];

但它向我显示了2个警告: 1.warning:从不兼容的指针类型初始化

2.warning:无效的接收者类型'id *'

我该如何做这项工作?

提前完成。

2 个答案:

答案 0 :(得分:1)

更正您的代码:

id anObject = [appDelegate.currentDeailedObject objectAtIndex:0];
int commentId = [anObject id];
NSString *commentType = [anObject type];

注意“id”之后缺少的“*”(id已经表示引用)和缺少的“valueForKey”(这是NSDictionary中的一个方法,它返回一个由提供的键表示的值)。

一般来说,这段代码应该有效 但我建议你创建一个超类或协议,它将拥有你需要的2种方法(例如“id”和“type”)。

例如(超类):

@interface MyComment : NSObject
{
    NSInteger commentId;
    NSString *_commentType;
}

@property (nonatomic) NSInteger commentId;
@property (nonatomic, copy) NSString *commentType;

@end

@implementation MyComment

@synthesize commentId, commentType = _commentType;

- (void)dealloc {
    [_commentType release];

    [super dealloc];
}

@end

// sample use
@interface MyCommentNumberOne : MyComment
{
}
@end

另一个例子(协议):

@protocol CommentPropertiesProtocol
@required
- (NSInteger)commentId;
- (NSString *)commentType;
@end

// sample use
@interface MyCommentNumberOne : NSObject <CommentPropertiesProtocol>
{
    NSInteger commentId;
    NSString *_commentType;
}
@end

@implementation MyCommentNumberOne

- (NSInteger)commentId {
    return commentId;
}
- (NSString *)commentType {
    return _commentType;
}

- (void)dealloc {
    [_commentType release];

    [super dealloc];
}

@end

答案 1 :(得分:0)

通用id变量通常不会进行指针赋值,因为它已经是指针。所以你应该使用类似的东西:

id anObject = [appDelegate.currentDeailedObject objectAtIndex:0];

您可能希望对commentIdcommentType使用强制转换,例如(NSNumber *)等等。