【问题标题】:How to get a string with class method IOS如何使用类方法IOS获取字符串
【发布时间】:2012-10-27 19:09:50
【问题描述】:

我有一个使用-void 方法设置的字符串值,我需要在类方法+ 中检索该字符串

我无法将 + 更改为 - 方法,因此我需要找出另一种方法来检索该字符串。

@synthesize folderPathName=_folderPathName;

-(void)loadFolderPathName:(NSString *)folder{

    _folderPathName=[[NSString alloc] initWithString:folder];

}

+(NSString *)getDocumentsDirectory
{

   // NSString *pathwithFoldername=[NSString stringWithFormat:@"Documents/%@",_folderPathName];
    NSString *documentsDirectory = [NSHomeDirectory() 
                                    stringByAppendingPathComponent:pathwithFoldername];
    return documentsDirectory;
}

我尝试过类似的东西

-(NSString *) getFolderPathName{

    return _folderPathName;
}

但这都不是

NSString *pathwithFoldername=[FileUtils getFolderPathName];

或者这个允许的函数调用

NSString *pathwithFoldername=[self getFolderPathName];

如何获取该字符串并在 + 方法中使用它?

【问题讨论】:

    标签: ios string class methods


    【解决方案1】:

    您需要在 .m 文件中声明一个静态 NSString 变量。

    static NSString *Path;
    

    然后添加一个类似的方法:

    +(NSString *)valueOfPath
    {
      return Path;
    }
    

    您需要在设置folderPathName 的位置设置此变量。

    您可以通过以下方式调用此方法:

    NSString *pathwithFoldername=[FileUtils valueOfPath];
    

    【讨论】:

      【解决方案2】:

      您需要了解面向对象的基础知识,才能了解这可能无法按您的预期工作,以及为什么不应该这样做。

      + (void)... 创建一个类方法,在整个应用程序中只能有一个。这意味着如果我在整个应用程序中调用一个类方法,它们都将转到同一个位置。

      - (void)... 创建一个实例方法。整个应用程序中可以有很多实例,当您调用实例方法时,它只会转到您的一个实例(其他实例不受影响)

      这包括在您也有可用的类方法时调用实例方法;它们的内存位置彼此分开。这意味着如果您通过实例方法设置一些数据,则该数据将无法用于类方法。 (反之亦然,如果您通过类方法设置一些数据,实例可以通过引用其类来获取该数据。

      现在,毕竟,我试图理解的一点是通过类方法设置数据并不是非常面向对象的。就个人而言,我使用类方法作为实例的助手,实例包含我需要的所有数据。如果您需要确保整个应用程序中只有一个实例,请使用单例模式 (See how here)。

      现在,在你的情况下,这意味着你可以这样做:

      +(id)sharedInstance
      {
          static dispatch_once_t pred;
          static MyClass *sharedInstance = nil;
          dispatch_once(&pred, ^{
              sharedInstance = [[MyClass alloc] init];
          });
          return sharedInstance;
      }
      
      -(void)loadFolderPathName:(NSString *)folder{
      
          _folderPathName=[[NSString alloc] initWithString:folder];
      
      }
      
      -(NSString *)getDocumentsDirectory
      {
          NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
          NSString *pathwithFoldername = [documentsDirectory stringByAppendingPathComponent:_folderPathName];
      
          return pathwithFoldername;
      }
      

      并通过以下方式访问您的单个实例:

      [MyClass sharedInstance]
      

      【讨论】:

      • 感谢您的详细解释,如果我必须在不同的类中使用一个值,我会使用单例设计模式,但在我的情况下,我发现它要做的工作太多:)
      • 好消息。一个严重的问题 - 获取 Documents 目录的代码不正确。应该是NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];。然后附加任何你需要的路径。
      • 我会更新的,谢谢提醒!答案的重点是 OO,我使用他们在问题中给出的代码来展示它的应用。
      • @MordFustang “如果我必须在不同的类中使用一个值,我会选择单例设计模式,但在我的情况下,我发现它要做的工作太多了”。对不起,但公平地说,这不是糟糕设计的好借口。您可能需要稍后维护该代码,如果您以“快速而肮脏”的方式进行操作,它会带来更多的麻烦。这不仅适用于您的情况,也是整个编程中遵循的一个很好的原则。
      • @rmaddy 为什么是lastobject?不应该是objectatindex:0吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2014-03-29
      • 2019-10-03
      • 2019-10-01
      • 2011-11-27
      相关资源
      最近更新 更多