我的NSString被确定为等于null,真气

时间:2013-01-05 01:45:08

标签: objective-c ios string nsstring initialization

这一直困扰着我,这没有任何意义。此函数返回它应该的任何内容。 EG,issueName。

-(id)initWithIssue:(NSString *)string {
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        NSString *thing = string;
        issueName = [[NSString alloc]initWithString:thing];
        NSLog(@"The issue name = %@", issueName);
    }
    return self;
}

但是,如果我尝试在viewDidLoad中访问'issueName':没有,无论我做什么,它都等于null。我已经尝试过清洁,设置自定义设置器,在属性或Ivar等之间切换。令人气愤的是,这个字符串在程序的这一点上消失了。

到底发生了什么,这真是令人生气。

修改

这是相关的整个代码。我是如何开始的。

点h文件:

@interface BFPaidAreaViewController : UITabBarController <BFNewsTableViewControllerDelegate> {
    NSString *issueName;    
}
-(id)initWithIssue:(NSString *)string;

点m文件:

-(id)initWithIssue:(NSString *)string {
    self = [super init];
    if (self) {
        // PLPiper I had it that way before, because I was fiddling out of frustration
        issueName = [[NSString alloc] initWithString:string];
        NSLog(@"This is Called, the issue name is equal to = %@", issueName);
    }
    return self;
}

-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"The issue = %@", issueName);
}

我正在调用视图控制器:

BFPaidAreaViewController *pavc = [[BFPaidAreaViewController alloc]initWithIssue:@"test"];

这将记录:

This is Called, the issue name is equal to = test
The issue = (null)

新修改

发现问题。这是一个UITableViewController。奇怪的是,当我将它的类更改为UIViewController时,它可以工作。这是一个错误还是只是正常行为?但更紧迫的是,如何绕过这个限制?

(只是为了解释我在UI方面做了什么,UITabBarController在一个模态视图中。这对UIViewController很好。)

上帝可怕的修复

-(id)initWithIssue:(NSString *)string {
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        NSString *thing = string;
        issueName = [[NSString alloc]initWithString:thing];
        NSLog(@"The issue name = %@", issueName);
    }
    [self viewDidLoad];
    return self;
}

让我觉得很脏。但它现在必须要做,我可以继续。如果有人能想出解决方案,请告诉我。对于我的活力感到抱歉,听到人们说'这到底是什么?'令人难以置信的沮丧?什么是issueName?伊娃?“什么时候它真的隐含在问题中。

3 个答案:

答案 0 :(得分:1)

好的,首先,替换:

self = [super initWithNibName:nil bundle:nil]; // Unneeded nil arguments

使用:

self = [super init]; // Equivalent method, less processing involved.

其次,替换:

NSString *thing = string;
issueName = [[NSString alloc]initWithString:thing];

只是:

_issueName = [[NSString alloc] initWithString:string];

如果issueName是一个属性(而你还没有@sythesized),则其表示应为_issueName

上述修复或多或少只是让代码更简洁。问题可能在于viewDidLoad:中的代码(见下文)。


现在您可以初始化Issue对象,并使用以下代码显示问题名称:

// Init:
Issue *myIssue = [[Issue alloc] initWithIssue:@"Example Issue"];
// Log:
NSLog(@"%@", myIssue.issueName);

日志应显示:

Example Issue

答案 1 :(得分:0)

你可以试试这个:

将issueName设为属性,例如

@property (strong, nonatomic) NSString *issueName;

然后像这样使用它,

-(id)initWithIssue:(NSString *)string {
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        NSLog(@"The string = %@", string);
        self.issueName = string;
        NSLog(@"The issue name = %@", issueName);
    }
    return self;
}

如果您使用的是自动合成属性(即没有手动为issueName声明@synthentize),那么您的iVar将被称为_issueName而不是issueName

你从上面的代码中得到了什么?

答案 2 :(得分:0)

我觉得这有点好奇。你打电话给[super initWithNibName:nil bundle:nil]。这让我相信这可能是NSViewController的子类。如果你这样初始化一个NSViewController,除了一些非常非标准的东西,-viewDidLoad可能不会被调用,因为没有要加载的NIB(因为你通过了nil超)。但显然你在-viewDidLoad中设置一个断点,所以它被调用(在某些东西上)。这使我认为您在XIB中将此类指定为文件所有者或加载NIB的自定义对象。如果是这种情况,则会让我相信您正在初始化的实例和被调用-viewDidLoad的实例不是同一个实例。您可以通过在每种方法中加入NSLog(@"self: %p", self);并查看它们是相同还是不同来为自己确认。

如果正在调用-viewDidLoad的实例已加载NIB,则不会调用您的init方法。相反,它将使用-initWithCoder

如果您可以详细说明这里的情况(即如何实例化,是否涉及任何XIB等),我将编辑我的答案以提供更多帮助,但我认为这里没有足够的信息真的很有帮助。

我感到沮丧。假设标准行为,这里的任何建议都应该有效。这只会加强我的怀疑,即这些不是同一个实例(在-initWithIssue-viewDidLoad之间。