一、什么是成员变量、属性、实例变量?
@interface ViewController : UIViewController
{
NSString *string1;
NSString *_string2;
int count;
float value;
}
@property (nonatomic, copy) NSString *string3;
@end
上诉例子中:
成员变量: string1、_string2、count、value
属性: string3
实例变量: string1、_string2
可以看到在 { } 中所声明的所有变量都是成员变量,所以string1、_string2、count、value都是成员变量;
因为实例是针对类而言,实例是类的声明,所以只有string1、_string2是实例变量;
属性就是用@property修饰的变量,即string3。
成员变量 = 实例变量 + 基本数据类型变量
二、下面列举各种不同情况下的使用
@interface ViewController : UIViewController
@property (nonatomic, copy) NSString *string;
@end
正常情况下会自动给string生成_string实例变量、setter和getter方法,通过_string和self.string获取变量;
如果
@synthesize string = _string;
与上面相同;如果
{ NSString *_string; }
与上面相同;如果
@synthesize string;
则不会自动生成_string实例变量,通过string和self.string获取变量;如果
@synthesize string = string;
与上面相同;如果
{ NSString *string; }
会自动生成_string实例变量,但实例变量string和属性string不是同一个变量,前者通过string和self->string获取,后者通过_string和self.string获取;
string = @"11";
_string = @"22";
NSLog(@"%@ %@", string, self.string);
结果:11 22
如果
{ NSString *string; }
并且@synthesize string;
则不会自动生成_string实例变量,通过string和self.string获取变量;如果
{ NSString *_string; }
并且@synthesize string;
则_string与self.string不是同一个变量,string与self.string同一个变量;
_string = @"11";
string = @"22";
NSLog(@"%@ %@", _string, self.string);
结果:11 22
总结:属性如果不用@synthesize修饰,则会默认生成带下划线的成员变量;如果用了@synthesize,若是用 @synthesize 属性名; 或者 @synthesize 属性名 = 属性名; 则不会生成带下划线的属性名的成员变量,若用 @synthesize 属性名 = _属性名; 与正常情况相同。
若声明了同名的不带下划线的成员变量,且没有用@synthesize修饰让该属性与该成员变量相等,则两者是不同的变量。