带有或不带有实例变量的 Objective-C 属性

标签 objective-c ios class properties

<分区>

Possible Duplicate:
Properties and Instance Variables in Objective-C 2.0

我只为 ivar 使用属性,在为我正在创作的类获取或设置值时不需要任何真正的验证。

Ex: 
@interface ClassB : NSObject
{
    // No ivars
}

@property (nonatomic, retain) ClassA *obj;
@property (nonatomic, retain) NSString *str;

每当我在类中调用这些方法时,我总是使用 self.obj/self.str 或 [self obj]/[self str]。通过这种方式,为了设置对象的状态,您被迫通过属性,以便编译器生成的 getter 和 setter 更仔细地管理引用。话虽如此,以这种方式创建我的类(class)是否会遇到任何问题?此外,在没有 ivar 的情况下,@implementation 文件中覆盖的“dealloc”方法是否需要任何“释放”?

最佳答案

如果您使用@synthesize 指令创建属性访问器,编译器还将创建您在类声明之外遗漏的任何ivar。您仍然需要发布您的 ivars。过去您无法直接访问合成的 ivar,因此必须在您的 -dealloc 方法中使用属性 setter ,如下所示:

- (void)dealloc
{
    self.obj = nil;
    self.str = nil;
    [super dealloc];
}

不过,如今,编译器将允许您直接访问合成的 ivar,因此您可以释放它而不是调用 setter(这在 -dealloc 中是个好主意,在其他任何地方都是个坏主意):

- (void)dealloc
{
    [obj release];
    [str release];
    [super dealloc];
}

当您最终将代码转换为 ARC(自动引用计数)时,这会发生变化,因为编译器会负责为您释放 -dealloc 中的 ivar。大多数时候,这意味着您的 -dealloc 实现可以消失。

关于带有或不带有实例变量的 Objective-C 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7154152/

相关文章:

ios - 找不到实例方法 '-presentViewController:animated'

C# 银行示例 - 客户类 - 取款、存款等

c++ - 成员变量在赋值后保存垃圾值

c++ - 类虚拟成员函数中的线程

ios - MKPolyline 检测自相交线 OBJECTIVE C

ios - 在 Objective C 示例教程中使用 C++ 文件

ios - 无法访问 iOS 静态库中资源包文件中的 Storyboard

ios - 如何在 Localized.strings 中添加基本本地化文件

javascript - iOS UIWebView 闪烁问题

ios - 推送通知未发送,因为它在后台运行,parse.com