我在我的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中创建的同一个实例。
对此的任何帮助都将非常感激。感谢。
答案 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
对象,而不使用该类中的实例变量。
你想在这两个班中做些什么?