Основы Objective-C: Объект, объявленный в MyAppDelegate, недоступен в другом классе - PullRequest
0 голосов
/ 10 апреля 2011

У меня есть объект, объявленный в моем делегате приложения:

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    ClassName *className;
}

В другом классе я включаю делегат приложения:

#import "MyAppDelegate.h"

@implementation AnotherClass
-(void)doMethod {
    [className doClassNameMethod];
}

Сбой во время компиляции из-за className не объявлено.Разве это не должно быть доступно, так как я включил MyAppDelegate, где объявлено className?Мне нужно, чтобы AnotherClass.doMethod обращался к тому же экземпляру, который создан в MyAppDelegate.

Любая помощь по этому вопросу будет наиболее ценной.Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2011

Как ваш второй класс должен знать об этой переменной в первую очередь?

То, что вы опубликовали здесь, показывает, что экземпляры вашего AppDelegate класса имеют члена с именем className, который имеет типClassName.Это означает, что в каждом методе экземпляра AppDelegate-class (начинающемся со знака минус) вы можете получить доступ к этой переменной по имени className.

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

Если вы хотите получить доступ к этой переменной откуда-то еще, есть пара опций - вероятно, наиболее распространенным из них будет предоставление метода доступа дляэто (и для этого снова есть несколько вариантов).

Рассмотрим следующее:

@interface ClassA : NSObject {
  NSMutableString *interestingMember;
  NSMutableString *inaccessibleMember;
}
-(NSMutableString*)interestingMember;
@end

@interface ClassB : NSObject {
}
-(void)appendString:(NSString*) toMemberOfObject:(ClassA*);
@end
@implementation ClassB
-(void)appendString:(NSString*)string toMemberOfObject:(ClassA*)object
{
  [[object interestingMember] appendString:string]; //this will work: you can access the variable through its accessor
  [inaccessibleMember length]; // this will give a compile error, because the variable is undefined in the current scope
}
@end

Так как это довольно простые вещи ООП, яМы рекомендуем вам прочитать Цель обучения C: Учебник для начинающих и некоторые другие вводные материалы на веб-сайте Apple.

2 голосов
/ 10 апреля 2011

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

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    ClassName *className;
}

@property (nonatomic, readonly) ClassName *className;

...
@end

Из другого класса вы можете затем получить доступ к этому свойству следующим образом:

@implementation AnotherClass
- (void) doMethod {
    MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate.className doClassNameMethod];
}
@end
1 голос
/ 10 апреля 2011

className не входит в область действия AnotherClass, он ничего не наследует от MyAppDelegate, вы можете создать MyAppDelegate объект в AnotherClass и использовать переменную className для своих целей, но вам все еще нужно использовать методы доступа в MyAppDelegate, чтобы поговорить с ним.

TLDR: #import "MyAppDelegate.h" позволяет вам создавать только MyAppDelegate объект в AnotherClass, не используя переменные экземпляра в этом классе.

Что вы пытаетесь делать именно в этих двух классах?

...