Car*_*Ray 0 iphone memory-management objective-c
@implementation ProductController
NSString *areaName = nil;
+ (void)setAreaName:(NSString *)areaName_ {
areaName = areaName_;
}
@end
Run Code Online (Sandbox Code Playgroud)
和
@implementation ProductController
NSString *areaName = nil;
+ (void)setAreaName:(NSString *)areaName_ {
if(areaName_ != areaName) {
[areaName release];
areaName = [areaName_ copy];
}
}
- (void)dealloc {
[areaName release];
}
@end
Run Code Online (Sandbox Code Playgroud)
现在哪一个是正确的?为什么?
如您所知,Obj-C中没有"类变量".解决方法只是一个C风格(全局或文件范围)变量,您设置的变量与上面显示的相似.首先,您应该使用static
关键字标记这些变量的文件范围:
static NSString *areaName = nil;
Run Code Online (Sandbox Code Playgroud)
您也可以考虑使用约定FirstLetterUppercase
来表示范围差异.
至于内存管理,你可以把它当作一个实例变量,但永远不会永远消失:
static NSString *AreaName = nil;
+ (void)setAreaName:(NSString *)name {
if (![name isEqualToString:AreaName]) {
[AreaName release];
AreaName = [name copy];
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在第二个示例中,您不应该从实例的-dealloc
方法中释放"class"变量.如果你有多个对象的实例,这会留下一个糟糕的悬空指针,并且无论如何都会破坏"类"变量的目的.通常,当您使用此模式时,您将"泄漏"(对于某些泄漏定义)类变量值,这没关系.
归档时间: |
|
查看次数: |
172 次 |
最近记录: |