我以为我理解@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应用程序,无法在运行时创建实例变量)
| 归档时间: |
|
| 查看次数: |
8305 次 |
| 最近记录: |