2011-04-14 3 views
0

Je suis en train de relayer cette question que j'avais posté il y a un jour. Quand j'ai décrit le problème avant que j'aie oublié certaines informations cruciales qui ont amené les gens à faire fausse route en essayant d'offrir une solution. J'espère que cela est mieux expliqué.Accès aux variables à travers quelques autres classes

J'ai un situatiion en Objective-C où je suis en train d'accéder à la variable d'un objet par un autre objet. Les classes (simplifié):

Ah

@interface A : NSObject { 
    NSMutableArray *someStuff; 
} 

@property (nonatomic, retain) NSMutableArray *someStuff;  

@end 

Am

@implementation A 

@synthesize someStuff; 

// blah, blah, blah 

Ensuite, parce que je fais une application iPhone, il y a un délégué de l'application qui contient une variable de ce type d'objet :

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate> { 

    A *aPtr; 
} 

@property (nonatomic, retain) A *aPtr; 
@end 

AppDelegate.m

@implementation AppDelegate 

@synthesize aPtr; 
  • applications

    (booléen): (*) UIApplication didFinishLaunchingWithOptions d'application: (NSDictionary *) launchOptions {

    unPtr = [[A alloc] init]; // bla, bla, bla

Puis, dans une autre classe (dans ce cas, un contrôleur de vue), je suis en train d'accéder 'someStuff' de cette manière:

AViewController.m

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

NSMutableArray *someArray = appDelegate.aPtr.someStuff; 

Donc, le problème est que cela explose de belle façon. J'avais pensé que si vous faites la désignation @porperty, et le @synthesize dans l'implémentation, alors vous devriez pouvoir accéder directement aux variables car le compilateur crée réellement les fonctions get/set.

Je pense que je suis trop d'un drogué de java pour comprendre pourquoi cela ne fonctionnera pas. Quelqu'un peut-il m'éveiller?

Un grand merci,

Craig

+0

essayez ceci, AppDelegate * appDelegate = (AppDelegate *) [[UIApplication sharedApplication] délégué]; NSLog (@ "aPtr:% @ \ nsomeStuff:% @", appDelegate.aPtr, appDelegate.aPtr.someStuff); – Ravin

Répondre

1

Oui, vous pouvez le faire. Suivez les instructions du commentaire, en d'autres termes, insérez votre délégué dans l'application pour éviter les avertissements. Assurez-vous également d'importer l'interface de votre AppDelegate et de votre classe A dans le fichier auquel vous essayez d'accéder.

+0

Est-ce que je comprends bien? Êtes-vous les gars en disant que cela ne fonctionne pas parce que je ne l'ai pas jeté le résultat de la méthode « délégué »? Bien, je dois admettre que je n'aurais probablement jamais trébuché dessus. Je vais essayer. Merci beaucoup @Ravin et @JimaDeVoe – Craig

+0

Travaillé! Merci! – Craig

0

Je pense que ce ne fonctionne pas parce que vous ne l'avez pas initialiser arr à nulle part, faire une fonction Am et délégué app appeler cette fonction lorsque vous initialisez la classe A et aussi dans Am dans cette fonction n'oublie pas d'initialiser le tableau.

+0

arr? Tu veux dire aPtr? Mais je l'ai fait, non? Dans AppDelegate.m, j'ai cette instruction: aPtr = [[A alloc] init]; et il y a une méthode 'init' dans l'implémentation de A.m (bien que, oui, je ne l'ai pas montrée ici). – Craig

Questions connexes