как работает точечный синтаксис в цели c - PullRequest
1 голос
/ 19 февраля 2010

Я пытаюсь выяснить, могу ли я использовать точечный синтаксис в цели c для доступа к переменным класса.

Например, если у меня есть класс с именем ClassA типа NSObject.

ClassA имеет экземпляр класса с именем ClassB также типа NSObject.

И в ClassB есть переменная с именем myString типа NSString;

В контроллере представления, который имеет экземпляр ClassA в качестве переменной, я пытаюсь получить доступ к "myString", говоря

NSString *aString=classA.classB.myString;

Что дает мне эту ошибку

 error: accessing unknown 'myString' component of a property

если к классу B можно получить доступ с помощью синтаксиса точки, почему нельзя использовать строковую переменную?

/////////// добавлено редактирование //////////

Извините за задержку. Кроме того, в поле комментария допускается только столько символов, что мне пришлось использовать вместо него поле «ансер».

#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;

Ответы [ 2 ]

5 голосов
/ 19 февраля 2010

Точечный синтаксис разработан как точный синоним для вызова методов к методам, которые играют роль установщика / получателя. Чтобы использовать синтаксис . [точка], тип объекта должен быть точно указан, и объект должен реализовать соответствующий метод. Синтаксис точки не используется для получения прямого доступа к переменным экземпляра.

Таким образом, вы говорите:

И у ClassB есть переменная с именем myString типа NSString;

И это, вероятно, проблема. Вам необходимо либо определить методы для доступа к myString, либо объявить свойство и @synthesize методы. Любой из них будет работать, и оба эффективно эквивалентны (за исключением деталей синтеза метода при использовании atomic).

<Ч />

Похоже, вы путаете "класс" и "экземпляр". Все в вашем коде указывает на случаи того и того, и вы пытаетесь сделать что-то вроде this.that.something, где something терпит неудачу?

Проблема в том, что вы используете @class для прямого объявления ссылки на класс. В основном, пока полное определение класса не будет замечено компилятором, любое выражение типа Foo *, где компилятор видел только @class Foo;, действует как общая ссылка на экземпляр класса неопределенного типа (вроде как, но не совсем , id).

Вам нужно # импортировать файлы, содержащие объявления ваших классов. Думайте об этом с точки зрения видимости компилятора. Когда вы компилируете файл с синтаксическим выражением точки, рассмотрите точный набор объявлений, которые компилятор видел до компиляции этого выражения . Если @interface для класса не было замечено, вы не можете использовать точечный синтаксис для экземпляра этого класса.

0 голосов
/ 19 февраля 2010

Наличие ивара не позволяет использовать точечный синтаксис.Вам нужно сделать его свойством , добавив

@property(retain) NSString* myString;

к @interface и

@synthesize myString;

к реализации @.По сути, синтаксис точки получения abc.efg может быть переведен в [abc efg].Но для доступа к ивару вы используете синтаксис abc->efg, который является совершенно другим понятием.Подробнее см. «Объявленные свойства» .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...