【问题标题】:Synthesizing a property without instance variables合成没有实例变量的属性
【发布时间】:2011-05-29 13:01:18
【问题描述】:

我以为我理解了@property 和@synthesize,但我做了一些实验,但我不明白为什么下面的(我认为是坏的)代码可以工作。

如您所见,没有对应于 name 属性的实例变量。如果没有找到具有相同名称和类型的实例变量,Objective-C 是否会以某种方式创建实例变量?

标题:

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject {

}

@property (copy, nonatomic) NSString *name;
-(void) print;

@end

实施:

#import "AddressCard.h"

@implementation AddressCard

@synthesize name;

-(void) print {
    NSLog(@"Name=%@", self.name);
}

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

@end

测试:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    AddressCard *ac = [[AddressCard alloc] init];
    ac.name = @"Brandon";
    [ac print];

    [ac release];

    [pool drain];
    return 0;
}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    快速回答是:“是”。在 Objective-C 2.0 中,综合属性会根据需要自动创建相应的 ivars。

    Apple's documentation 有更多细节。

    重要提示: 正如Tommy 指出的那样(注意:这是来自旧版文档 - 请参阅 the latest information):

    在任何现代运行时(即 Intel 64 位和 ARM)上的 Objective-C 2.0 中,属性都可以“动态”添加到类中(即在运行时但仅在创建任何实例之前 - 与动态相比不是特别动态到运行时的其余部分)。但是,这不能在两个较旧的运行时(即 Intel 32 位和 PowerPC)中的任何一个上完成。因此,您实际上并不想在为 Mac 发布软件或在开发 iOS 期间使用它(因为模拟器是 32 位 Intel 应用程序,无法在运行时创建实例变量)

    【讨论】:

    • @e.James 我确实知道。每天学习新东西。
    • 这不是真的。在现代运行时(即 Intel 64 位和 ARM)上的 Objective-C 2.0 中,属性可以“动态”添加到类中(即在运行时但仅在创建任何实例之前 - 与其他实例相比不是特别动态运行时)。但是,这不能在两个较旧的运行时(即 Intel 32 位和 PowerPC)中的任何一个上完成。因此,在为 Mac 发布软件或在 iOS 开发期间,您并不是真的想使用它(因为模拟器是 32 位 Intel 应用程序,无法在运行时创建实例变量)。
    • @Tommy:感谢您的提醒。我将您的评论放在答案中以确保它被注意到
    • @Jonathan:是的,从 iOS 4.0 开始。
    • 答案中的链接不再有效。 Apple 重新排列了他们的文档。让我们希望这些能持续一段时间。请参阅Declared Properties 底部的“运行时差异”部分。另外,Runtime Version and Platforms.
    【解决方案2】:

    只有 64 位架构可以省略实例变量声明

    【讨论】:

      【解决方案3】:

      我想补充一点,虽然实例变量是自动创建的,但它的命名与属性相同。通过这样做,您以后可能会在代码中遇到错误。因此,除了防止在某些架构上无法自动生成的情况外,您还应该始终创建实例变量,以免以后出现任何意外情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-22
        • 1970-01-01
        • 2010-10-17
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多