Objective-c基础:在MyAppDelegate中声明的对象在另一个类中不可访问

时间:2011-04-10 13:15:30

标签: objective-c declaration

我在我的app delegate中声明了一个对象:

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

在另一个课程中,我包括了app delegate:

#import "MyAppDelegate.h"

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

由于 className 未声明,因此在编译时失败。不应该是可访问的,因为我已经包含了MyAppDelegate,其中声明了className?我需要AnotherClass.doMethod来访问在MyAppDelegate中创建的同一个实例。

对此的任何帮助都将非常感激。感谢。

3 个答案:

答案 0 :(得分:3)

你的其他班级应该如何首先了解这个变量?

您在此处发布的内容表明,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

因为这是相当基本的面包和OOP的黄油东西,我鼓励你阅读Apple的网站上的Learning Objective C: A Primer和其他一些介绍性材料。

答案 1 :(得分:2)

要从另一个类访问一个类中的实例变量,您应该创建一个属性。

@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

答案 2 :(得分:1)

className不在AnotherClass的范围内,它不会从MyAppDelegate继承任何内容,您可以在MyAppDelegate中创建AnotherClass对象,利用className变量供您使用,但您仍需要使用MyAppDelegate中的访问者方法与之交谈。

TLDR:#import "MyAppDelegate.h"仅允许您在MyAppDelegate中创建AnotherClass对象,而不使用该类中的实例变量。

你想在这两个班中做些什么?