合成没有实例变量的属性

Bra*_*rke 29 objective-c

我以为我理解@property和@synthesize,但我做了一些实验,我无法弄清楚为什么下面(我认为被破坏)代码有效.

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

标题:

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject {

}

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

@end
Run Code Online (Sandbox Code Playgroud)

执行:

#import "AddressCard.h"

@implementation AddressCard

@synthesize name;

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

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

@end
Run Code Online (Sandbox Code Playgroud)

测试:

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;
}
Run Code Online (Sandbox Code Playgroud)

e.J*_*mes 25

快速回答是:"是".在Objective-C 2.0中,合成属性将根据需要自动创建相应的ivars.

Apple的文档有更多细节.

重要提示:正如 Tommy指出的那样(请注意:这是来自遗留文档 - 请参阅最新信息):

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

  • @Tommy:它实际上可以在iOS模拟器上正常工作.:) (6认同)
  • 这不是真的.在任何现代运行时(即Intel 64位和ARM)的Objective-C 2.0中,属性可以"动态"添加到类中(即,在运行时但仅在创建任何实例之前 - 与其他实例相比并不特别动态运行时).但是,这不能在两个较旧的运行时(即Intel 32位和PowerPC)中的任何一个上完成.因此,您不想在Mac的运输软件或iOS开发期间使用它(因为模拟器是32位英特尔应用程序,无法在运行时创建实例变量). (4认同)