Objective-C点语法或属性值?

时间:2009-12-31 15:09:19

标签: objective-c

我一直在阅读点语法是可能的,但我不断收到结构不包含我引用的成员的错误。也许它不是点语法,所以我已经包含了我正在做的细节,希望能找到解决方案:

//  MobRec.h - used as the objects in the MobInfo array
#import <Foundation/Foundation.h>

@interface MobRec : NSObject {
@public NSString *mName;        
     @public int mSpeed;
}

@property (nonatomic, retain) NSString *mName; 
@property (nonatomic) int mSpeed;

// MobDefs.h - array of MobRecords
@interface Mobdefs : NSObject {
@public NSMutableArray *mobInfo;
}

@property(assign) NSMutableArray *mobInfo;  // is this the right property?

-(void) initMobTable;

@end

// MobDefs.m
#import "Mobdefs.h"
#import "Mobrec.h"
@implementation Mobdefs
@synthesize mobInfo;

-(void) initMobTable 
{
    // if I use traditional method I get may not respond 
    [mobInfo objectAtIndex:0 setmName: @"doug"];

    // if I use dot syntax I get struct has no member named mName 
    mobInfo[1].MName = @"eric";
}

// main.h
MobDefs *mobdef;

// main.m 
mobdef = [[Mobdefs alloc] init];
[mobdef initMobTable];

虽然这两种方法都可行,但我两者都有错误。我究竟做错了什么?我最好的想法是我使用了错误的@property,但我想我已经尝试了所有。我在main执行alloc。理想情况下,我想为此使用点语法,并且无法理解为什么它不允许它。

3 个答案:

答案 0 :(得分:9)

以下几点:( 编辑:由于错误而删除原始点#1

  1. 虽然支持点语法,但NSArray的数组索引语法不支持。因此,您对mobInfo[1]的调用将[mobInfo objectAtIndex:1];相同而是将mobInfo视为简单的C风格数组,并且几乎可以保证会导致崩溃。

  2. 您不应像在main.h中那样在头文件中定义变量。第MobDefs *mobdef;行属于main.m。

  3. 编辑:以下是它的外观:

      

    <强> MobRec.h

    @interface MobRec : NSObject {
        NSString *mName;        
        int mSpeed;
    }
    
    @property (nonatomic, retain) NSString *mName; 
    @property (nonatomic) int mSpeed;
    
      

    <强> MobRec.m

    @implementation MobRec
    @synthesize mName;
    @synthesize mSpeed;
    @end
    
      

    <强> MobDefs.h

    @interface MobDefs : NSObject {
        NSMutableArray *mobInfo;
    }
    @property(assign) NSMutableArray *mobInfo;
    -(void) initMobTable;
    @end
    
      

    <强> MobDefs.m

    #import "MobDefs.h"
    #import "MobRec.h"
    
    @implementation MobDefs
    @synthesize mobInfo;
    
    -(void) initMobTable 
    {
        // option 1:
        [(MobRec*)[mobInfo objectAtIndex:0] setMName:@"doug"];
    
        // option 2:
        (MobRec*)[mobInfo objectAtIndex:0].mName = @"eric";
    
        // option 3:
        MobRec *mobRec = [mobInfo objectAtIndex:0];
        mobRec.mName = @"eric";
    }
    
      

    <强>的main.m

    MobDef *mobdef = [[MobDefs alloc] init];
    [mobdef initMobTable];
    ...
    [mobdef release]; // don't forget!
    

答案 1 :(得分:3)

您需要强制转换-objectAtIndex:返回的对象,或者对其使用方法调用:

[[mobInfo objectAtIndex: 0] setMName: @"doug"];

((Mobrec *) [mobInfo objectAtIndex: 0]).MName = @"doug";

答案 2 :(得分:0)

  

[mobInfo objectAtIndex:0 setmName:@“doug”];

没有objectAtIndex:setmName方法,所以你必须解释你认为这甚至应该做什么。

  

mobInfo [1] .MName = @“eric”;

使用objectAtIndex在NSArray对象中查找内容。