当前位置:  开发笔记 > Android > 正文

点语法如何在目标c中工作

如何解决《点语法如何在目标c中工作》经验,为你挑选了1个好方法。

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

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

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

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

在具有ClassA实例作为变量的视图控制器中,我试图通过说法来访问"myString"

NSString *aString=classA.classB.myString;

这给了我这个错误

 error: accessing unknown 'myString' component of a property

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

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

抱歉耽搁了.评论框也只允许这么多字符,所以我不得不使用anser框.

#import 

@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

//试图在这里添加点语法

这行代码在一个syctizes promoValueObject的类中

NSString *skin=promoValueObject.promoSkin.promo_skin_url;

bbum.. 5

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

因此,你说:

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

这可能就是问题所在.你需要要么定义方法来访问myString或声明的属性和@synthesize方法.两者都可以工作,两者都是有效的(除了使用时方法综合的细节atomic).


看来你混淆了"阶级"和"实例".在你的代码一切都指向这样那样的情况下,你正在尝试做这样的事情this.that.something,其中something失败的原因?

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

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



1> bbum..:

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

因此,你说:

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

这可能就是问题所在.你需要要么定义方法来访问myString或声明的属性和@synthesize方法.两者都可以工作,两者都是有效的(除了使用时方法综合的细节atomic).


看来你混淆了"阶级"和"实例".在你的代码一切都指向这样那样的情况下,你正在尝试做这样的事情this.that.something,其中something失败的原因?

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

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有