1

我有一个使用-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];

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

4

2 回答 2

2

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

static NSString *Path;

然后添加一个方法,如:

+(NSString *)valueOfPath
{
  return Path;
}

您需要在设置folderPathName.

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

NSString *pathwithFoldername=[FileUtils valueOfPath];
于 2012-11-07T17:13:26.490 回答
2

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

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

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

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

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

现在,在您的情况下,这意味着您可以执行以下操作:

+(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]
于 2012-11-07T17:20:40.223 回答