objective-c和内存管理中的类变量

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)

现在哪一个是正确的?为什么?

Ben*_*tto 5

如您所知,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"变量.如果你有多个对象的实例,这会留下一个糟糕的悬空指针,并且无论如何都会破坏"类"变量的目的.通常,当您使用此模式时,您将"泄漏"(对于某些泄漏定义)类变量值,这没关系.