Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 更改NSString的值,是否正确?_Iphone_Objective C - Fatal编程技术网

Iphone 更改NSString的值,是否正确?

Iphone 更改NSString的值,是否正确?,iphone,objective-c,Iphone,Objective C,我创建了一个类,如下所示 @interface sampleClass: UIViewController { NSString *currentLocation; } @property (nonatomic, copy) NSString *currentLocation; 因此,只要当前GPS发生变化,就会调用如下函数: -(void)newLocationUpdate:(NSString *)text { NSString *temp = [[NSString alloc]

我创建了一个类,如下所示

@interface sampleClass: UIViewController
{
    NSString *currentLocation;
}
@property (nonatomic, copy) NSString *currentLocation;
因此,只要当前GPS发生变化,就会调用如下函数:

-(void)newLocationUpdate:(NSString *)text {
  NSString *temp = [[NSString alloc] initWithString:text];
  currentGPS = temp;
  [temp release];
}

我想知道我是否做对了?谢谢。

如果您的
currentLocation
/
currentGPS
设置器正确实现(使用
@synthetic
或手动实现),那么您做的工作太多了。如果您使用
copy
标志声明了一个属性,那么setter方法本身将执行手动执行的复制。您所需要的只是这一行:

[self setCurrentGPS:text];
或者,如果您更喜欢属性语法:

self.currentGPS = text;

这将自动调用
copy
方法,这基本上是一种更有效的方法,可以通过
[[NSString alloc]initWithString:text]

完成您正在做的事情

您的类
sampleClass
有一个名为
currentLocation
的ivar和一个名为
currentLocation
的属性。在
newLocationUpdate
方法中,将名为
currentGPS
的变量设置为传递给该方法的字符串值。如前所述,
currentGPS
与变量
currentLocation
或属性
currentLocation
没有关系

另外,您在
newLocationUpdate
方法中使用
init
release
似乎对Obj-C中的内存管理工作方式有一个根本性的误解。你绝对应该阅读苹果关于内存管理的指南

这是重要的东西!祝你好运。

这里:

@interface sampleClass: UIViewController
{
NSString *currentLocation;
}
 -(void)newLocationUpdate:(NSString *)text;
m


我会这样做的。对吗?可能不会。行吗?是。

忽略
当前位置
/
当前GPS
混淆-不,这仍然不太正确

您不显示
currentLocation
的设置程序。我假设它是一个
@synthesis
d属性。如果您只是编写
currentLocation=something
,那么您没有调用属性设置器;您只需设置实例变量。这意味着在下一行中释放对象后,实例变量可能指向解除分配的对象

正确的写入方法(同样,假设您有一个合成的访问器)是:

-(void)newLocationUpdate:(NSString *)text {
  self.currentLocation = text;
}
这将调用属性访问器,它将为您复制对象

如果出于某种原因,您需要直接访问实例变量(例如,如果这是
currentLocation
的setter方法),您将编写:

-(void)newLocationUpdate:(NSString *)text {
  [currentLocation release];
  currentLocation = [temp copy];
}

@interface
和您发布的方法似乎没有关联。我想你需要澄清一下你的问题。你想做什么?为什么选择复制而不是保留?@DysonApps:对于实现
copy
的类,它可能是该类型属性的正确选择。原因是,如果类允许您复制它,这意味着它可能是可变的(否则复制就没有意义)。如果你只是保留一个可变对象,其他所有者可以在你不知情或不同意的情况下对其进行变异。所以,如果你有选择的话,你几乎总是想使用
copy
。它会一直工作,直到你的应用程序崩溃为止,因为你管理内存错误。@Chuck,是的,这在我身上发生过几次(simple retain修复了它,hacky,我知道)。我发布的方式不是最好的,但它会完成工作(暂时)嗨,Chuck,谢谢你的回答,你说“如果出于某种原因需要直接访问实例变量”是什么意思?谢谢。@nababa:
currentLocation
既是实例变量又是属性。实例变量是存储值的位置,而属性定义如何访问实例变量。合成属性创建方法来处理诸如确保释放旧对象并在分配时复制新对象之类的事情。编写
self.currentLocation
时,您将通过属性访问器。当您编写
currentLocation
(注意不要
self.
)时,您直接访问实例变量,而不需要通过属性访问器。@aryaxt:有人对这个问题的所有答案进行了检查并投了否决票,但Matt的答案除外。我不知道他们为什么这么做——至少有三个答案是正确的(算上这一个),而马特的答案是近乎错误的(我说近乎错误只是因为答案承认它是错误的)。我投了库比的票来平衡,但我想我错过了这一次。
-(void)newLocationUpdate:(NSString *)text {
  [currentLocation release];
  currentLocation = [temp copy];
}