我创建了一个类,如下所示
@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];
}
我想知道我做得对吗?感谢。
答案 0 :(得分:2)
忽略currentLocation
/ currentGPS
混淆 - 不,这仍然不太正确。
您没有显示currentLocation
的设定者。我假设它是@synthesize
d属性。如果您只是写currentLocation = something
,那么您不会调用属性设置器;你只是设置实例变量。这意味着在下一行中释放对象后,您的实例变量可能指向一个已释放的对象。
写它的正确方法(再次,假设你有一个合成访问器)将是:
-(void)newLocationUpdate:(NSString *)text {
self.currentLocation = text;
}
这会调用属性访问器,它会为您复制对象。
如果出于某种原因你需要直接访问实例变量(比如这个是 currentLocation
的setter方法),你会写:< / p>
-(void)newLocationUpdate:(NSString *)text {
[currentLocation release];
currentLocation = [temp copy];
}
答案 1 :(得分:1)
如果您已正确实施currentLocation
/ currentGPS
setter(使用@synthesize
或手动实施),那么您的工作量太大了。如果您有一个使用copy
标志声明的属性,那么setter方法本身将执行您手动执行的复制。您只需要这一行:
[self setCurrentGPS:text];
或者,如果您更喜欢属性语法:
self.currentGPS = text;
这将自动调用copy
方法,这基本上是一种更有效的方法,可以使用[[NSString alloc] initWithString:text]
执行您正在做的事情。
答案 2 :(得分:0)
下面:
@interface sampleClass: UIViewController
{
NSString *currentLocation;
}
-(void)newLocationUpdate:(NSString *)text;
的.m
-(void)newLocationUpdate:(NSString *)text {
currentLocation = text;
}
这就是我这样做的方式。这是对的吗?可能不是。它会起作用吗?是。
答案 3 :(得分:-1)
不,你做错了。
您的班级sampleClass
有一个名为currentLocation
的ivar和一个名为currentLocation
的属性。在newLocationUpdate
方法中,您将名为currentGPS
的变量设置为传递给该方法的字符串值。如上所述,currentGPS
与变量currentLocation
或属性currentLocation
无关。
此外,您在init
方法中使用release
和newLocationUpdate
似乎可能会对Obj-C中的内存管理工作方式产生根本性的误解。你一定要阅读Apple的内存管理指南。
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
这是重要的事情!祝你好运。