Objective c NSString可以使用一种方法,但不能使用另一种方法
我有两种不同的方法试图从另一个类中获取变量。第一个,我更喜欢用它不起作用,第二个,我不喜欢用它。有人能解释一下原因吗 AppDelegate.hObjective 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
#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视为获取指向该单例实例的指针的方法