2014-12-29 6 views
0

Я определяю NSString в файле заголовка, но передаю значение null, когда пытаюсь записать эту строку с этого контроллера, но регистрирует значение переменной, если она не вызывается из представления контроллер, что является проблемой, поскольку он также пропускает значение null, когда я пытаюсь записать его в другой контроллер представления. Я нашел другие подобные вопросы, но никакие решения, похоже, не помогают, поэтому, если у вас есть решение, которое было бы фантастическим.Передача null при передаче nsstring

Я определил его как таковой в заголовочном файле:

#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

Почему NSString слабый? – rocky

+0

Второй журнал определенно будет нулевым в этом случае, так как вы не инициализировали свойство вопроса в этом экземпляре QuestionController ... Но является ли это первым лог-печатью? –

+0

Нет особой причины быть слабым, но когда я меняю его на сильное, это ничего не меняет. @rocky –

ответ

0

Когда вы пишете

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

вы не "запись этой строки из этого [текущего] контроллера." Вместо того, чтобы вы создали совершенно отдельный экземпляр вашего QuestionController (не то же самое, что и текущий контроллер представления, из которого вы только что установили question) и так как вы не установили его свойствоquestion в любой точке, что NSLog будет печатать ноль.

В своем первом NSLog однако, т.е.

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

вы на самом деле протоколирования question, как указано в текущем экземпляре вашей QuestionController так печатает, как ожидалось.

Чтобы установить questionController «s question свойства содержать question, хотя, попробуйте:

QuestionController *questionController = [[QuestionController alloc]init]; 
questionController.question = question; 
NSLog(@"%@", questionController.question); 
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, вы теперь получить доступ к Ивар непосредственно, или вы можете пользователя self.question в этот экземпляр для доступа к нему через геттер/сеттер.
  • удалил часть stringWithFormat, вы на самом деле не использовали этот метод, и достаточно просто «то, что вы хотите написать» будет достаточно.
  • Фактически вы назначаете новую версию QuestionController, когда вы выполняете QuestionController * questionController = [[QuestionController alloc] init]; Это означает, что теперь у вас есть QuestionController, который создает другой QuestionController при загрузке представления.
  • вопросController.question = _question; задает объект строки вопроса в новом объекте QuestionController, который создается, когда представление первого QuestionController загружается в строку вопроса, которая у вас есть в исходном QuestionController.

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

Смежные вопросы