【问题标题】:Declaring variable inside and outside of @implementation [duplicate]在@implementation 内部和外部声明变量[重复]
【发布时间】:2013-03-23 15:18:49
【问题描述】:

我只是想通过下面的代码来理解变量的生命。在实例化新实例时,我可以看到 _inside 和 _outside 保留,而大括号则没有。

@interface ViewController (){
    NSString *_innBraces;
}

@end

NSString *_outside;

@implementation ViewController{
    NSString *_inmBraces;
}

NSString *_inside;

-(id)initWithInside:(NSString*)inside outside:(NSString*)outside nBraces:(NSString*)nBraces mBraces:(NSString*)mBraces{
    self = [super init];
    if (self) {
        _inside = inside;
        _outside = outside;
        _innBraces = nBraces;
        _inmBraces = mBraces;
        return self;
    }else{
        return nil;
    }
}
  1. _inside 和_outside 的声明地点有区别吗?
  2. 大括号变量的声明位置有何不同?
  3. 以相同方式声明的静态变量与 _inside/_outside 变量之间有什么区别?

【问题讨论】:

    标签: objective-c


    【解决方案1】:
    1. _inside_outside 都被声明为全局变量。
    2. 由于您似乎在同一个文件中声明所有内容,_innBraces_inmBraces 之间没有区别,它们都是类中的实例变量。如果@interface 在头文件中,那么您会看到两者之间的范围不同,因为_inmBraces 仅在您的实现文件中可见,而_innBraces 将在任何包含以下内容的文件中可见.h 文件。
    3. 这些都没有声明为静态的。如果它们曾经是(在 static 关键字之前),那么它们在声明它们的文件的存储和命名空间中都是本地的。

    在 1 和 3 的情况下,它们都是直接的 C 声明,因此它们是否在 @implementation@interface 的范围内没有任何区别。在 Objective-C 中,没有类变量。

    对于类变量,一般流程是创建一个文件静态变量的形式:

    static NSString *sMyClassVariable;
    

    在实现文件中。这个变量,因为它是静态的,在你的实现文件之外的任何其他文件中都不可见。

    【讨论】:

    • 我不确定_inside,无法在课堂外访问
    • @AnoopVaidya 是的,它可以。它只是一个具有全局范围的 C 变量。
    • @gaige,你能否解释一下#2评论在.h文件中声明时它会得到什么范围?你能详细说明#3吗?谢谢。
    • @JeremyP:但它在 .m 中?如您所见,我很困惑,所以我删除了我的答案。
    猜你喜欢
    • 2023-04-03
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多