【问题标题】:how does dot syntax work in objective c点语法在目标 c 中如何工作
【发布时间】:2010-02-19 16:00:27
【问题描述】:

我试图弄清楚是否可以在目标 c 中使用点语法来访问类变量。

例如,如果我有一个 NSObject 类型的名为 ClassA 的类。

ClassA 有一个名为 ClassB 的类的实例,也是 NSObject 类型。

ClassB 有一个名为 myString 的变量,类型为 NSString;

在一个将 ClassA 实例作为变量的视图控制器中,我试图通过说来访问“myString”

NSString *aString=classA.classB.myString;

这给了我这个错误

 error: accessing unknown 'myString' component of a property

如果classB可以用点语法访问,为什么字符串变量不能访问?

//////////添加编辑//////////

抱歉耽搁了。 此外,评论框只允许这么多字符,所以我不得不使用分析框。

#import <Foundation/Foundation.h>

@class PromoTrackValueObject;
@class PromoMixValueObject;
@class PromoSkinValueObject;
@class EventsValueObject;
@class BuyValueObject;


@interface PromoValueObject : NSObject {
    NSString *promoXMLPath;
    NSString *type;
    NSString *username;
    NSString *entityname;
    NSString *userid;
    NSString *hasavatar;
    NSString *trackbuy_profile;
    NSString *bio;
    NSString *country;
    NSString *url_facebook;
    NSString *url_twitter;
    NSString *url_discog;
    NSString *url_myspace;
    NSString *url_chart;
    NSString *labelname;
    NSString *labelurl;
    NSString *labelimg;
    NSString *agent_name;
    NSString *agent_url;
    NSString *agent_img;
    NSString *promo_date;

    PromoTrackValueObject *promoTrack;
    PromoMixValueObject *promoMix;
    PromoSkinValueObject *promoSkin; // class containing string property in question is in here
    EventsValueObject *events;
    BuyValueObject *buy;



}

@property (nonatomic,copy)NSString *promoXMLPath;
@property (nonatomic,copy)NSString *type;
@property (nonatomic,copy)NSString *username;
@property (nonatomic,copy)NSString *entityname;
@property (nonatomic,copy)NSString *userid;
@property(nonatomic,copy)NSString *hasavatar;
@property (nonatomic,copy)NSString *trackbuy_profile;
@property(nonatomic,copy)NSString *bio;
@property(nonatomic,copy)NSString *country;
@property(nonatomic,copy)NSString *url_facebook;
@property(nonatomic,copy)NSString *url_twitter;
@property(nonatomic,copy)NSString *url_discog;
@property(nonatomic,copy)NSString *url_myspace;
@property(nonatomic,copy)NSString *url_chart;
@property(nonatomic,copy)NSString *labelname;
@property(nonatomic,copy)NSString *labelurl;
@property(nonatomic,copy)NSString *labelimg;
@property(nonatomic,copy)NSString *agent_name;
@property(nonatomic,copy)NSString *agent_url;
@property(nonatomic,copy)NSString *agent_img;
@property(nonatomic,copy)NSString *promo_date;

@property(nonatomic,retain)PromoTrackValueObject *promoTrack;
@property(nonatomic,retain)PromoMixValueObject *promoMix;
@property(nonatomic,retain)PromoSkinValueObject *promoSkin;
@property(nonatomic,retain)EventsValueObject *events;
@property(nonatomic,retain)BuyValueObject *buy;
@end


#import "PromoValueObject.h"
@implementation PromoValueObject
@synthesize promoXMLPath;
@synthesize type;
@synthesize username;
@synthesize entityname;
@synthesize userid;
@synthesize hasavatar;
@synthesize trackbuy_profile;
@synthesize bio;
@synthesize country;
@synthesize url_facebook;
@synthesize url_twitter;
@synthesize url_discog;
@synthesize url_myspace;
@synthesize url_chart;
@synthesize labelname;
@synthesize labelurl;
@synthesize labelimg;
@synthesize agent_name;
@synthesize agent_url;
@synthesize agent_img;
@synthesize promoMix;
@synthesize promoSkin;
@synthesize events;
@synthesize buy;
@synthesize promoTrack;
@synthesize promo_date;

- (void)dealloc {
    [promoTrack release];
    [promoMix release];
    [promoSkin release];
    [events release];
    [buy release];
   [promoXMLPath release];
    [type release];
    [username release];
    [entityname release];
    [userid release];
    [hasavatar release];
    [trackbuy_profile release];
    [bio release];
    [country release];
    [url_facebook release];
    [url_twitter release];
    [url_discog release];
    [url_chart release];
    [labelname release];
    [labelurl release];
    [labelimg release];
    [agent_name release];
    [agent_url release];
    [agent_img release];
    [promo_date release];
    [super dealloc];
}

@结束

@interface PromoSkinValueObject : NSObject {

    NSString *promo_skin_url;  // the string I'm after
    NSString *promo_skin_id;

}

@property(nonatomic,retain)NSString *promo_skin_url;
@property(nonatomic,retain)NSString *promo_skin_id;


@end



   #import "PromoSkinValueObject.h"


    @implementation PromoSkinValueObject
    @synthesize promo_skin_url;
    @synthesize promo_skin_id;
    @end

//这里尝试添加点语法

这行代码在一个系统化 promoValueObject 的类中

NSString *skin=promoValueObject.promoSkin.promo_skin_url;

【问题讨论】:

    标签: objective-c syntax


    【解决方案1】:

    点语法被设计成一个精确的同义词,用于方法调用扮演 setter/getter 角色的方法。要使用. [dot] 语法,必须准确指定对象的类型并且对象必须实现适当的方法。点语法用于以某种方式直接访问实例变量。

    因此,你说:

    ClassB 有一个变量,名为 NSString 类型的 myString;

    这很可能是问题所在。您需要或者定义访问myString 的方法或声明一个属性和@synthesize 方法。两者都可以工作,并且两者实际上是等效的(使用atomic 时保留方法综合的细节)。


    您似乎混淆了“类”和“实例”。您的代码中的所有内容都指向这个和那个的实例,而您正试图在 something 失败的情况下执行类似 this.that.something 的操作?

    问题是您使用@class 转发声明类引用。基本上,在编译器看到完整的类定义之前,任何像 Foo * 这样编译器只看到 @class Foo; 的表达式都像对未指定类型的类的实例的泛型引用(有点像,但不完全是, id)。

    您需要#import 包含类声明的文件。从编译器可见性的角度来考虑它。当您编译具有点语法表达式的文件时,请考虑编译器在编译该表达式之前看到的确切声明集。如果没有看到该类的 @interface,则不能在该类的实例上使用点语法。

    【讨论】:

      【解决方案2】:

      拥有 ivar 不能使点语法起作用。您需要通过添加使其成为 属性

      @property(retain) NSString* myString;
      

      到@interface,并且

      @synthesize myString;
      

      到@实现。

      基本上,getter 点语法abc.efg 可以翻译成[abc efg]。但是要访问 ivar,您使用语法 abc-&gt;efg,这是一个完全不同的概念。详情请见“Declared Properties”

      【讨论】:

      • 嗯,我有@property 和@synthesize。我尝试了整个 -> 但我得到了一个指针错误。我想我应该看看你发布的链接。
      • 您不需要@property 即可通过点语法访问某些内容。
      • 使用abc-&gt;efg 通常被认为是糟糕的形式。请写访问器(或@synthesize 一些带有属性的)。
      • 原来我没有在我的主 UIVIEW 中导入“B 类”。我认为我不需要,因为它是在“A 类”中导入的,哑...da 哑 da 哑。感谢所有反馈!
      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多