我通常不会偶然发现这些事情,但我试图在另一个班级中放置甚至取一个ivar。我也尝试将变量设置为强,但我总是得到一个空值。
@interface NewView : NSView <NSApplicationDelegate> {
IBOutlet NSString *__setValue;
}
@property (weak, nonatomic) IBOutlet NSString *setValue;
- (IBAction)doStuff:(id)sender;
@end
#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
@interface AppDelegate : NSObject <NSApplicationDelegate> {
NSString *__appDelegateString;
}
@property (weak, nonatomic) NSString *appDelegateString;
-(IBAction)displayString:(id)sender;
@end
#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?
答案 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)
上面的代码有太多的问题让我找不到确切的失败点,所以这里有一个改善情况的提示列表:
@property
声明
而不是ivars和@synthesize
。NSString
属性需要strong
,而不是weak
。把它们想象成气球,你想把一根绳子绑在那个气球上,还是让它飘走。如果你让它飘走然后最后需要它,你就搞砸了。set
命名您的ivar(或您的属性),您最后会因为您的属性默认情况下自动合成该前缀而让您感到困惑。从像myString
这样无害的东西开始,它将自动合成到getter / setter:-(NSString *)myString
和-(void)setMyString:(NSString *)myString
__
为前缀,这对您的情况和问题也是不必要的。见#1