美文网首页
iOS成员变量、属性、实例变量

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

作者: 天空知诚 | 来源:发表于2020-04-10 10:23 被阅读0次
一、什么是成员变量、属性、实例变量?

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

相关文章

网友评论

      本文标题:iOS成员变量、属性、实例变量

      本文链接:https://www.haomeiwen.com/subject/vpplmhtx.html