Проблема с глобальными строками в XCode - PullRequest
1 голос
/ 26 марта 2011

Я довольно новичок в какао и XCode, я сделал немного базового C-кодирования, но я в значительной степени отстой в Objective-C и Cocoa, поэтому, пожалуйста, извините меня за любые глупые ошибки, которые я делаю. Моя проблема с этими глобальными переменными, которые я использую. У меня есть глобальная переменная NSString, объявленная в заголовочном файле, и она используется в основном файле следующим образом:

//AppController.h
-(IBAction)button1:(id)sender;
-(IBAction)button2:(id)sender;
extern NSString *hi
//AppController.m
-(IBAction)button1:(id)sender
{
NSString *const hi = @"Hello";
}
-(IBAction)button2:(id)sender;
{
NSLog (@"%@", hi);
}

Однако, когда я нажимаю «выполнить», сборка завершается неудачно, и я получаю сообщение об ошибке:

"_ hi", ссылка с:

Дополнительная информация:

Undefined symbols for architecture x86_64: "_hi", referenced from: -[AppController gallery:] in AppController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Если вы знаете, что это значит и / или как это исправить, пожалуйста, помогите мне. Спасибо

Ответы [ 4 ]

4 голосов
/ 26 марта 2011

Вам необходимо предоставить глобальное определение для hi.Переместите вашу декларацию:

NSString *const hi = @"Hello";

в любое место вне любого метода.Я не совсем уверен, что вы хотите button1: сделать, но это не кажется необходимым для вашей реализации.

2 голосов
/ 26 марта 2011

При определении глобальных переменных и константных строк и т. Д. Обычно так я делаю:

MDAppController.h * * 1004

#import <Cocoa/Cocoa.h>

extern NSString * const MDShouldShowInspectorKey;
extern NSString * const MDShouldShowViewOptionsKey;
extern BOOL MDShouldShowInspector;
extern BOOL MDShouldShowViewOptions;

@interface MDAppController : NSObject <NSApplicationDelegate> {
   IBOutlet NSWindow *window;
}
- (IBAction)hideInspector:(id)sender;
@end

MDAppController.m

#import "MDAppController.h"
NSString * const MDShouldShowInspectorKey   = @"MDShouldShowInspector";
NSString * const MDShouldShowViewOptionsKey = @"MDShouldShowViewOptions";
BOOL MDShouldShowInspector = NO; // default value
BOOL MDShouldShowViewOptions = YES;  // default value

@implementation MDAppController
+ (void)initialize {
    NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary];
    [defaultValues setObject:
        [NSNumber numberWithBool:MDShouldShowInspector]
                      forKey:MDShouldShowInspectorKey];

    [defaultValues setObject:
         [NSNumber numberWithBool:MDShouldShowViewOptions] 
                      forKey:MDShouldShowViewOptionsKey];

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSUserDefaults *uD = [NSUserDefaults standardUserDefaults];
    MDShouldShowInspector = [[uD objectForKey:MDShouldShowInspectorKey] boolValue];
    MDShouldShowViewOptions = [[uD objectForKey:MDShouldShowViewOptionsKey] boolValue];
}
- (IBAction)hideInspector:(id)sender {
    NSLog(@"MDShouldShowViewOptionsKey == %@", MDShouldShowViewOptionsKey);
    MDShouldShowInspector = NO;
    [[NSUserDefaults standardUserDefaults]
               setObject:[NSNumber numberWithBool:MDShouldShowInspector]
                    forKey:MDShouldShowInspectorKey];
}
@end
2 голосов
/ 26 марта 2011

Полагаю, Люку нравится:
Установить строку на определенное значение после нажатия кнопки 1,
и восстановить ее после нажатия кнопки 2.

AppController.h

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject{

    NSString * string;

}

-(IBAction)button1:(id)sender;
-(IBAction)button2:(id)sender;

@end

AppController.m

#import "AppController.h"

@implementation AppController

-(IBAction)button1:(id)sender
{
    string = @"Hello";
}

-(IBAction)button2:(id)sender;
{
    NSLog (@"%@", string);
}

@end
0 голосов
/ 26 марта 2011

Мой вопрос: почему ты хочешь быть внешним?Лучший способ здесь - создать синглтон, вы должны иметь всех членов как часть класса и избегать каких-либо глобальных.Надеюсь, это поможет

...