传递nsstring时传递null

时间:2014-12-29 23:07:20

标签: ios objective-c null nsstring nslog

我在头文件中定义了一个NSString,但是当我尝试从该控制器记录该字符串时它传递null,但是如果没有从视图控制器调用它,则记录变量的值,这是一个问题,因为当我尝试将其记录到不同的视图控制器时它也传递null。 我找到了其他类似的问题,但似乎没有任何解决方案可以提供帮助,所以如果你有一个很棒的解决方案。

我已经在头文件中定义了它:

 #import <UIKit/UIKit.h>
@interface QuestionController : UIViewController
@property(weak, nonatomic) NSString *question;
@end

我在主文件中这样称呼它:

#import "QuestionController.h"
@implementation QuestionController
@synthesize question;
-(void) viewDidLoad{
    [super viewDidLoad];
    question = [NSString stringWithFormat:@"hey"];
    NSLog(@"%@", question);
    QuestionController *questionController = [[QuestionController alloc]init];
    NSLog(@"%@", questionController.question);


}
@end

2 个答案:

答案 0 :(得分:0)

写作时

QuestionController *questionController = [[QuestionController alloc]init];
NSLog(@"%@", questionController.question);

&#34;从[当前]控制器记录该字符串。&#34;相反,您已经创建了QuestionController完全独立的实例(与您刚刚设置question的当前视图控制器不同)并且因为您没有&# 39;在任何时候设置 question属性,NSLog将打印为nil。

然而,在你的第一个NSLog中,即

question = [NSString stringWithFormat:@"hey"];
NSLog(@"%@", question);

您实际上是在question的当前实例中设置的QuestionController,因此按预期打印。

要设置questionController的{​​{1}}属性以包含question,请尝试:

question

答案 1 :(得分:0)

我已清理您的代码以使其正常工作,在底部您会找到解释。

 #import <UIKit/UIKit.h>
@interface QuestionController : UIViewController
@property(strong, nonatomic) NSString *question;
@end


#import "QuestionController.h"
@implementation QuestionController

-(void) viewDidLoad{
    [super viewDidLoad];
    _question = @"hey";
    NSLog(@"%@", _question);
    QuestionController *questionController = [[QuestionController alloc]init];
    questionController.question = _question;
    NSLog(@"%@", questionController.question);


}
@end

有几点需要注意。

  • NSString *问题现在是一个强大的参考,而不是弱。如果你把它保留为弱,那么诸如question = @“Hello”之类的东西将不起作用,因为没有对该字符串对象的强引用,它将被解除分配。
  • 我删除了@synthesize,你不再需要这样做,除非你使用的是旧版本的Xcode
  • 我将问题更改为_question,您现在直接访问ivar,或者您可以在该实例中使用self.question通过getter / setter访问它。
  • 删除了stringWithFormat部分,你并没有真正使用那个方法而只做@“你要写的东西”就足够了。
  • 当你做QuestionController * questionController = [[QuestionController alloc] init]时,你实际上正在分配一个新版本的QuestionController;这意味着您现在有一个QuestionController,它在加载视图时会创建另一个QuestionController。
  • questionController.question = _question;在第一个QuestionController的视图加载到原始QuestionController中的问题字符串时,在您创建的新QuestionController对象上设置问题字符串对象。

希望这有助于您准确了解代码中发生了什么。我假设你没有故意在第一个加载时创建一个新的QuestionController。这也会导致某种无限循环,因为您创建的每个循环都会在您访问其视图属性时创建另一个循环。