【问题标题】:Set string from a method with class level access从具有类级别访问权限的方法中设置字符串
【发布时间】:2011-05-18 17:10:10
【问题描述】:

我想做以下事情

+(void)DoThis
{
    [textView setString:@"qwertyasdfzxcvb."];
    [textView setNeedsDisplay:YES];
}

但是,它拒绝设置字符串。 因为这行得通,

-(void)DoThis
{
    [textView setString:@"qwertyasdfzxcvb."];
    [textView setNeedsDisplay:YES];
}

我得出的结论是,该字符串拒绝在具有类级别访问权限的方法中设置。那么如何允许从 +(void) 设置字符串?

【问题讨论】:

  • textView 在哪里声明?是全局变量吗?
  • @jojaba @property(nonatomic, retain) IBOutlet NSTextView *textView;

标签: objective-c string methods


【解决方案1】:

假设 textView 是一个实例变量,没有办法访问它。充其量,你可以

+ (void)DoThis:(UITextView*)aTextView {
    [aTextView setString:@"qwertyasdfzxcvb."];
    [aTextView setNeedsDisplay:YES];
}

【讨论】:

  • 如何在 IB 中挂钩 aTextView?
  • 您想要实现的究竟是什么需要类方法而不是实例方法?
  • 另一个文件将调用该方法。
  • 你不能创建一个类的实例吗?
  • 如果没有持有textView的类的实例,你认为'textView'将如何存在?您能否解释一下您正在努力实现的目标,以便我们更好地理解这一点?
【解决方案2】:

您最有可能尝试做的是从类方法中设置一个实例变量。这不起作用,因为类对象不是类的实例,因此无法访问实例变量。所以你的方法 + (void)DoThis 无权访问 textView instance 变量,因为类对象不是该类的 instance

【讨论】:

    【解决方案3】:

    您不能从类方法中设置实例变量。如果你想声明一个“类变量”,你必须在类的 .m 文件中创建一个static global variable,因为在 Objective-C 中没有类变量。这是一个 C 静态变量,不是 Java 或 C# 所考虑的。在这里,“静态”确保变量不能在该文件之外使用。

    【讨论】:

    • 您不能将属性设为静态。
    • 不,你不能。正如我所说,如果你想声明一个“类变量”,你必须在 .m 文件中创建一个静态全局变量
    • 您不能从类方法中设置实例变量,因为它没有意义。为什么不使用实例方法?
    • 因为我需要从不同的位置或其他类方法调用该方法。
    【解决方案4】:

    我认为您可能正在寻找的是单例/共享模式,它允许任何代码访问类的特定实例,而无需传递该实例。

    整个 Cocoa 都使用此模型。例如,NSFileManager 有一个类方法 defaultManager,它返回类的共享实例。您首先调用defaultManager 在此共享实例上调用实例方法,因此例如调用实例方法isDeletableFileAtPath 您编写:

    [[NSFileManager defaultManager] isDeletableFileAtPath:path]
    

    在您的情况下,您的 DoThis 变为:

    + (void) DoThis
    {
        EvDudeClass *shared = [EvDudeClass sharedInstance];
        [shared.textView setString:@"qwertyasdfzxcvb."];
        [shared.textView setNeedsDisplay:YES];
    }
    

    你需要在你的类中添加一个sharedInstance 方法。有很多方法可以做到这一点,具体取决于您希望如何使用您的课程 - 它是单例吗?您只需要一个共享实例和其他非共享实例吗?您是否只想共享在 NIB 中创建的实例?正如您提到的IBOutlet,这是一个实现后者的实现:

    static EvDudeClass *privateSharedInstance = nil;
    
    - (void) awakeFromNib
    {
        privateSharedInstance = self; // save this instance so it can be shared
        // other init stuff
    }
    
    + (EvDueClass *)sharedInstance { return privateSharedInstance; }
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2017-10-08
      • 1970-01-01
      • 2010-10-13
      • 2015-06-22
      相关资源
      最近更新 更多