Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在何处初始化类中的实例变量_Iphone_Objective C - Fatal编程技术网

Iphone 在何处初始化类中的实例变量

Iphone 在何处初始化类中的实例变量,iphone,objective-c,Iphone,Objective C,我是objective-c的新手,我对全局变量总是有问题。我不知道在哪里初始化它们。我的问题是NSString。我写了这段代码—— in.h 在viewDidLoad中,' 而且 -(IBAction) showInformations:(id)sender; { NSLog(@" informations ok"); NSLog(@"my sesison : %@ ",session); } 但我在节目信息中崩溃了:我想会话是空的。帮助请尝试使用点语法设置属性: self.

我是objective-c的新手,我对全局变量总是有问题。我不知道在哪里初始化它们。我的问题是NSString。我写了这段代码——

in.h

在viewDidLoad中,'

而且

-(IBAction) showInformations:(id)sender;
{
    NSLog(@" informations ok");
    NSLog(@"my sesison : %@  ",session);
}

但我在节目信息中崩溃了:我想会话是空的。帮助请尝试使用点语法设置属性:

self.session=@“Hello”;
这将确保正确的内存管理

session = @"hello";
self.session = @"hello";
上述两种说法之间存在巨大差异。第一个只是将hello分配给session。在这里,字符串hello是自动释放的,因此当您点击按钮时会话无效,因为您没有保留会话。但在第二行中使用self。当使用self时,它不仅仅是一个简单的赋值,实际上是对访问器方法的调用。在这里,您在属性声明中使用了retain。因此,当使用self时,将调用会话的setter,该setter将保留self。因此,当您点击按钮时,会话有效

总结了使用权限属性和使用self来避免许多内存问题


编辑:正如fluchtpunkt所指出的,此解释对字符串文本无效。当我写这篇文章时,我觉得字符串文字很特别

在代码中的某个地方必须有另一个对会话的写访问权限。一行代码,看起来像session=[NSString stringWith…]

因此,找到代码中为会话变量赋值的其他部分,并用适当的内存管理替换错误的内存管理。问题不在您显示的三行范围内

根据您的代码,它应该是

self.session = [NSString stringWith...
或者如果你喜欢,不方便

[session release];
session = [[NSString stringWith...] retain];

你确定session=@HEllo;真正的代码是什么?代码中唯一保存会话变量的部分是什么?听起来您没有正确保留该值。坦率地说,我认为这段代码没有任何问题。问题在于session=@hello in viewdiload,因为那里没有调用setter。查看OP对我和johnnieb答案的评论。这不是问题所在。不需要像@hello这样保留字符串文本。字符串文字永远不会被释放,因此它们也永远不会被释放。我赌10美元,那次行动没有发布真正的代码。他只是在自动释放的字符串对象上使用self.session更改。这就是为什么它对他有效。我明白你的意思。但是现在不能测试这个,因为我现在没有Mac电脑。不需要测试任何东西。fluchtpunkt是正确的,@常量字符串不需要保留。但是,使用方便的方法和宏(如NSLocalizedString)创建的字符串确实可以。
self.session = [NSString stringWith...
[session release];
session = [[NSString stringWith...] retain];