不能从其他班级获得ivar

时间:2015-02-06 02:02:30

标签: objective-c macos properties

我通常不会偶然发现这些事情,但我试图在另一个班级中放置甚至取一个ivar。我也尝试将变量设置为强,但我总是得到一个空值。

NewView.h

@interface NewView : NSView <NSApplicationDelegate> {
    IBOutlet NSString *__setValue;
}
@property (weak, nonatomic) IBOutlet NSString *setValue;
- (IBAction)doStuff:(id)sender;
@end

NewView.m

#import "NewView.h"
#import "AppDelegate.h"
@implementation NewView 
@synthesize value;
@synthesize setValue;

- (IBAction)doStuff:(id)sender {

     /* Also Tried
     AppDelegate *get = [[AppDelegate alloc] init];
     setValue = get.appDelegateString;
     */

    NSLog(@"setValue: %@",setValue); // always returns NULL
}
@end

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate> {
    NSString *__appDelegateString;
}
@property (weak, nonatomic) NSString *appDelegateString;
-(IBAction)displayString:(id)sender;
@end

AppDelegate.m

#import "AppDelegate.h"
#import "NewView.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate
@synthesize appDelegateString;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self displayString:nil];
}

-(IBAction)displayString:(id)sender {
    appDelegateString = @"TEST";
    NSLog(@"appDelegateString: %@", appDelegateString);
    [self putString];
}

- (void)putString {
    NewView *put = [[NewView alloc] init];
    put.setValue = appDelegateString;
}
@end

的NSLog:

appDelegateString: TEST
setValue: (null)

我是否需要做一些特别的事情来跨越课程来获取ivar?

2 个答案:

答案 0 :(得分:1)

在设置awakeFromNib属性之前,会调用

value

如果您将putNumber方法更改为以下内容:

- (void)putNumber {
    NewView *put = [[NewView alloc] init];
    put.value = [NSString stringWithFormat:@"%d", number];
    NSLog(@"value: %@", put.value);
}

它应该适当地打印该值。

如果您检查其中的.value属性并返回NULL,那几乎可以肯定,因为您正在检查NewView班级的其他实例, <{1}}属性尚未设置的一个。

答案 1 :(得分:0)

上面的代码有太多的问题让我找不到确切的失败点,所以这里有一个改善情况的提示列表:

  1. 让您的生活更轻松,并开始使用@property声明 而不是ivars和@synthesize
  2. 您的NSString属性需要strong,而不是weak。把它们想象成气球,你想把一根绳子绑在那个气球上,还是让它飘走。如果你让它飘走然后最后需要它,你就搞砸了。
  3. 不要使用前缀set命名您的ivar(或您的属性),您最后会因为您的属性默认情况下自动合成该前缀而让您感到困惑。从像myString这样无害的东西开始,它将自动合成到getter / setter:-(NSString *)myString-(void)setMyString:(NSString *)myString
  4. IBSutlet for NSString完全没用。
  5. 您的ivars以__为前缀,这对您的情况和问题也是不必要的。见#1