Objective c NSString可以使用一种方法,但不能使用另一种方法

Objective c NSString可以使用一种方法,但不能使用另一种方法,objective-c,macos,cocoa,class,nsstring,Objective C,Macos,Cocoa,Class,Nsstring,我有两种不同的方法试图从另一个类中获取变量。第一个,我更喜欢用它不起作用,第二个,我不喜欢用它。有人能解释一下原因吗 AppDelegate.h #import <Cocoa/Cocoa.h> @interface AppDelegate : NSObject <NSApplicationDelegate> { NSString *someString; } @property (assign) IBOutlet NSWindow *window; @pro

我有两种不同的方法试图从另一个类中获取变量。第一个,我更喜欢用它不起作用,第二个,我不喜欢用它。有人能解释一下原因吗

AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {

    NSString *someString;
}

@property (assign) IBOutlet NSWindow *window;
@property (retain, nonatomic) NSString *someString;

- (void)manualSetVariable;

@end
 #import <Foundation/Foundation.h>

@interface GrabFromAppDelegate : NSObject {

    NSString *varSet;
    IBOutlet NSTextField *variable;
}

@property(retain, nonatomic) NSString *varSet;

- (IBAction)showVariable:(id)sender;
- (IBAction)manuallyGrabVariable:(id)sender;

@end
GrabFromAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {

    NSString *someString;
}

@property (assign) IBOutlet NSWindow *window;
@property (retain, nonatomic) NSString *someString;

- (void)manualSetVariable;

@end
 #import <Foundation/Foundation.h>

@interface GrabFromAppDelegate : NSObject {

    NSString *varSet;
    IBOutlet NSTextField *variable;
}

@property(retain, nonatomic) NSString *varSet;

- (IBAction)showVariable:(id)sender;
- (IBAction)manuallyGrabVariable:(id)sender;

@end

在第二个方法中,您从app delegate调用该方法,此时在someString变量中设置值,并得到响应。但是,如果使用实例为appDelegate中的varibale设置值,则设置的值将传递给控制器类的特定实例,而不是所有实例。因此,要么创建该变量的共享实例,要么调用该特定实例
通过showVariable方法获取值somestring。

这是非常错误的:

AppDelegate *getString = [[AppDelegate alloc] init];
它分配一个AppDelegate实例,但它不是
[[NSApplication sharedApplication]委托]
,因此
getString
实例将永远不会执行
ApplicationIDFinishLaunching
方法,并且您的someString iVar将永远不会被设置。如果在
init
函数中设置某个字符串,
[[AppDelegate alloc]init]
当然会调用init。但是由于
getString
没有附加到
NSApplication
实例,因此没有任何东西将
applicationdFinishLaunching
方法委托给它

如果要获取指向应用程序委托的指针,可以执行以下操作:

AppDelegate *getString = [[NSApplication sharedApplication] delegate];
或者,为了简洁起见:

AppDelegate *getString = [NSApp delegate];

我尝试调用该实例,但没有成功。我不确定如何共享变量的实例。我认为通过将其作为属性并进行合成就足够了。@CocoaPuffs-可以“共享”它,但您创建了一个从未初始化过它的实例,因为该实例从未执行
applicationdFinishLaunching
方法。看到我的答案了。所以,通过设置其中任何一个,其余的代码都应该可以工作?如果我的眼球像编译器一样彻底,是的。将app委托对象视为一个单例,将NSApp视为获取指向该单例实例的指针的方法