iOS成员变量、属性、实例变量

一、什么是成员变量、属性、实例变量?

@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修饰让该属性与该成员变量相等,则两者是不同的变量。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容