【问题标题】:How do you reference a value of a class inside of a method in the same class in Objective-C?如何在 Objective-C 中的同一类中引用方法内的类的值?
【发布时间】:2016-07-21 21:38:58
【问题描述】:

我有一些 Objective-C 代码:

@interface CustomInitializers:NSObject
{
     NSString *classStr;
     NSInteger classInt;
} 
+ (id) init;
+ (id) initWithString: (NSString *) stringToSet;
+ (id) initWithInteger: (NSInteger) intToSet;
+ (id) initWithAll:(NSString *)stringToSet classInt:(NSInteger)intToSet;  
- (NSInteger) getClassInt;
- (NSString *) getClassStr;
@end

当我实现这个类时,我通过在变量前加下划线来引用变量(例如 _classStr)。但是这样编译的时候会提示错误:

[file name]:[line number]:[character]: Usage of undeclared identifer "_randSen"

如何防止这种情况发生?

【问题讨论】:

    标签: objective-c class variables methods


    【解决方案1】:

    以下实例变量:

    {
         NSString *classStr;
         NSInteger classInt;
    } 
    

    都是类的范围实例变量。当您通过以下方式创建属性时:

     @property (strong, nonatomic) NSString *classStr;
     @property (strong, nonatomic) NSInteger classInt;
    

    生成 getter 和 setter 以访问生成的实例变量。自动生成的实例变量由带有下划线的属性名称组成。

    您所做的只是创建实例变量。所以:

     NSString *classStr;
     NSInteger classInt;
    

    实际上是您的实例变量。如果您希望在它们前面加上下划线(正确的方法),您应该在它们前面加上:

     NSString *_classStr;
     NSInteger _classInt;
    

    实际上,如果它们在您的标题中,您应该使用属性。只有私有实例变量应该作为作用域实例变量来完成,这些变量将存在于实现文件而不是头文件中。

    有很多信息可以更详细地解释这一点:link

    【讨论】:

    • 谢谢!有没有办法阻止属性生成 getter 和 setter?
    • 不,属性的目的是自动生成 getter/setter/和实例变量。这是相当标准的。如果你想要一个私有属性,只需将它放在实现文件中。如果您确实只需要实例变量(这通常是出于非常非常特殊的原因,并且通常不推荐没有充分的理由),只需执行上述有关将变量移动到实现文件中并在前面加上下划线来表示它们作为实例变量。
    • 99% 的时间你应该使用属性
    • 将值添加到实现文件会使其“导入全局”[原文如此]?例如,如果我这样做:#import "ThisCode.m",那么该代码是否有该变量可供任何使用?
    • 有一种方法可以阻止属性合成自己的getter/setter,而且非常简单。只需编写您的 getter 和 setter,该属性将不再滚动。
    【解决方案2】:

    如果在方法中声明了变量,则意味着它仅存在于该范围内,因此简单的答案是您无法访问它。一种解决方案是将变量设为实例属性,以便您可以从类中的任何方法访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      相关资源
      最近更新 更多