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

iOS 中的属性变量、成员变量、实例变量这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战 前言 ios中什么是属性变量、什么是成员变量?什么是实例变量? 他们之间有什么联系? 具体的使用方法是什么? 什么情况下需要用

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

前言

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

他们之间有什么联系?

具体的使用方法是什么?

什么情况下需要用属性变量?又是什么情况下用成员变量?

什么是成员变量和实例变量

  1. 成员变量是在{}中声明的变量
  2. 如果成员变量的类型是一个类则称这个变量为实例变量
  3. 成员变量包括实例变量,所以可以通称为成员变量(原来你俩是一伙的)
  • 比如在.h头文件的{}中定义的
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Persion : NSObject{
    NSString *name; //实例变量
    int age;//成员变量
}
@end
NS_ASSUME_NONNULL_END

其中name 是实例变量,age是成员变量

  • 比如在.m文件中的{}中定义的
#import "Persion.h"
@interface Persion ()
{
    NSString *gender;//实例变量
    int height;//成员变量
}
@end

@implementation Persion

@end

其中gender是实例变量,height是成员变量

什么是属性变量

通常我们使用@property声明的变量都叫做属性变量

  • 比如在.h头文件中这样定义

    #import <Foundation/Foundation.h>
    NS_ASSUME_NONNULL_BEGIN
    @interface Persion : NSObject
    @property (nonatomic, copy) NSString *info;//属性变量
    @end
    NS_ASSUME_NONNULL_END
    

    其中info变量就是属性变量

  • 比如在.m文件中这样定义

    #import "Persion.h"
    @interface Persion ()
    
    @property (nonatomic, copy) NSString *hobby;//属性变量
    @end
    

    其中hobby变量就是属性变量

他们之间有什么联系

说:你们之间什么关系,到底谁勾引谁。。。

【手动狗头】。哈哈

扒掉衣服仔细观察他们还是有些联系的

  • 当我们创建一个属性变量时,系统会自动创建一个与之对应的成员变量

    比如以下代码:

    #import "Persion.h"
    @interface Persion ()
    @property (nonatomic, copy) NSString *hobby;//属性变量
    @end
    
    @implementation Persion
    
    - (instancetype)init {
        if (self = [super init]) {
            self->_hobby = @"爱美女";//使用成员变量赋值
        }
        return self;
    }
    

    可以看到,当我们创建一个属性变量hobby后,就可以直接使用成员变量_hobby进行赋值,可见系统已经创建了对应的成员变量

成员变量具体使用方法

创建

上面也说了,在{}中创建的变量才是成员变量

  • 比如在.h头文件的{}中定义的
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Persion : NSObject{
    NSString *name; //实例变量
    int age;//成员变量
}
@end
NS_ASSUME_NONNULL_END

其中name 是实例变量,age是成员变量

  • 比如在.m文件中的{}中定义的
#import "Persion.h"
@interface Persion ()
{
    NSString *gender;//实例变量
    int height;//成员变量
}
@end

@implementation Persion

@end

其中gender是实例变量,height是成员变量

  • 上面四个成员变量,不论是在.m还是在.h中创建的都无法在外部其他类进行访问访问就会报错:

    image-20211113225115411

提示Instance variable 'name' is protected, 用我蹩脚的英文翻译了下,就是说”实例变量‘name’受保护”,没错,是受到保护,因为:

成员变量创建后默认是@protected类型,就是受保护的,外接无法访问

  • @private、@protected、@public

    @protected 受保护的,只能在本类或子类中访问,默认类型

    @private 私有的,只能在本类中访问

    @public 公开的,可以在外部进行访问

    我们将上面的例子改造下,将name改为@public类型:

    @interface Persion : NSObject
    {
        @public NSString *name; //实例变量
        int age;//成员变量
    }
    @end
    

    可以看到在main中就可以正常访问了。

    image-20211113225847108

    注意,.m文件中的成员变量即使加@public也没用,外部也访问不了

使用

成员变量的赋值和取值只能通过->符号

image-20211113230408524

属性变量具体使用方法

创建

属性变量创建需要使用@property

  • 比如在.h头文件中这样定义

    #import <Foundation/Foundation.h>
    NS_ASSUME_NONNULL_BEGIN
    @interface Persion : NSObject
    @property (nonatomic, copy) NSString *info;//属性变量
    @end
    NS_ASSUME_NONNULL_END
    

    其中info变量就是属性变量

  • 比如在.m文件中这样定义

    #import "Persion.h"
    @interface Persion ()
    
    @property (nonatomic, copy) NSString *hobby;//属性变量
    @end
    

    其中hobby变量就是属性变量

  • 属性变量系统会自动创建对应的getter/setter方法

使用

因为有创建的getter setter 方法,则可以直接使用点语法来使用属性变量

image-20211113233258330

  • 在.m 中创建的属性变量只能在类内部使用,外部无法使用

番外

iOS中的@synthesize 和 @dynamic详解

#以上是小弟的一些学习总结,不正之处各位老铁请多多指正~~~

今天的文章iOS 中的属性变量、成员变量、实例变量分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14105.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注