objective-c - NSString 适用于一种方法,但不适用于另一种方法

标签 objective-c macos cocoa class nsstring

我有两种不同的方法来尝试从另一个类中获取变量。我更喜欢使用的第一个不起作用 - 我不喜欢使用的第二个却不起作用。有人可以解释一下为什么吗?

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

AppDelegate.m

#import "AppDelegate.h"
#import "GrabFromAppDelegate.h"

@implementation AppDelegate

@synthesize someString;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification  
{
    someString = @"The Variable";
    NSLog(@"In AppDelegate (1): %@",someString);

    GrabFromAppDelegate *getThis = [[GrabFromAppDelegate alloc] init];
    getThis.varSet = someString;
}

- (void)manualSetVariable {        // THIS METHOD WORKS (2)

    someString = @"The Variable";
    NSLog(@"In AppDelegate(2): %@",someString);
}

@end

GrabFromAppDelegate.h

 #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.m

#import "GrabFromAppDelegate.h"
#import "AppDelegate.h"

@implementation GrabFromAppDelegate

@synthesize varSet;

- (IBAction)showVariable:(id)sender {

    if (varSet != NULL) {
        [variable setStringValue:[NSString stringWithString:varSet]];
        NSLog(@"Got String Using (1): %@",varSet);
    }
}

- (IBAction)manuallyGrabVariable:(id)sender {     // THIS METHOD WORKS (2)

    AppDelegate *getString = [[AppDelegate alloc] init];
    [getString manualSetVariable];

    if ([getString someString] != NULL) {
        [variable setStringValue:[NSString stringWithString:[getString someString]]];
        NSLog(@"Got String Using (2): %@",[getString someString]);
    }
}

@end

最佳答案

这是非常错误的:

AppDelegate *getString = [[AppDelegate alloc] init];

这会分配一个 AppDelegate 实例,但它不是 [[NSApplication sharedApplication] delegate],因此 getString 实例永远不会执行 applicationDidFinishLaunching方法和你的 someString iVar 永远不会被设置。如果您在 init 函数中设置 someString,[[AppDelegate alloc] init] 当然会调用 init。但由于 getString 未附加到 NSApplication 实例,因此无需将 applicationDidFinishLaunching 方法委托(delegate)给它。

如果您想获取指向应用程序委托(delegate)的指针,您可以执行以下操作:

AppDelegate *getString = [[NSApplication sharedApplication] delegate];

或者,为了简洁起见:

AppDelegate *getString = [NSApp delegate];

关于objective-c - NSString 适用于一种方法,但不适用于另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23978149/

相关文章:

cocoa - 核心数据 - 从模型中删除实体

Objective-C 在类变量上调用类方法

iphone - 无法使 deleteRowsAtIndexPaths 工作

swift - 如何以管理员权限运行命令

objective-c - 有什么方法可以监控 Mac 上的新应用程序安装事件吗?

cocoa - 在 NSPathControl 对象中显示启动时打开文档的路径

objective-c - AVPlayer 播放声音,但在 Mac 应用程序中不显示 View

iphone - 改变 UIButton 状态时内部尺寸不更新

swift - 在 NSSplitViewController 中的两个 View Controller 之间传递数据的正确方法是什么?

macos - Heroku CLI 错误 - "cli.Spinner is not a function"