iOS 属性和成员变量的区别

属性和成员变量都是类的构成部分,用来保存类的数据,要很好的理解他们,需要从一下几个方面:

  • 声明方式
  • 声明的位置
  • 作用域和访问的方式

1. 声明的方式

都可以在.h 和 .m 文件中声明,注意修饰符。
Animal.m

@interface Animal ()
@property (nonatomic, strong) NSString *mName;
@end

@implementation Animal{
@public
    NSString *mPublicMemberValue;
@private
    NSString *mPrivateMemberValue;
@protected
    NSString *mProtectedMemberValue;
@package
    NSString *mPackageMemberValue;
}

-(void)showSomething{
  NSLog(@"");
}

Animal.h

#import <Foundation/Foundation.h>

@interface Animal : NSObject{
    @public
    NSString *hPublicMemberValue;
    @private
    NSString *hPrivateMemberValue;
    @protected
    NSString *hProtectedMemberValue;
    @package
    NSString *hPackageMemberValue;
}

@property (nonatomic, strong) NSString *hName;

@end

Bird为Animal子类
Bird.h

#import "Animal.h"

@interface Bird : Animal

@end

Bird.m

#import "Bird.h"

@implementation Bird

-(void)birdShowSomething{
    NSLog(@"");
}

@end

接下来我们从一下几个地方看下对属性的访问

  • 外部访问属性
image.png
  • 外部访问成员变量
image.png
  • 子类访问属性
image.png
  • 子类访问成员变量
image.png
image.png

总结

  1. 成员变量通过->访问, 属性通过.访问
  2. 在.h中声明的属性,可以被子类或外部访问。
  3. 在.m中声明的属性,外部(含子类)不可访问。
  4. 在.h中声明的成员变量:
修饰符 访问方式
@public 都可访问
@protected 只有子类可访问,外部不可访问
@private 外部(含子类)不可访问
@package 同一个package下都可访问
  1. 在.m中声明的成员变量
    外部(含子类)不可访问
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容