0

我对 Objective-C 很陌生,正在尝试一个简单的 xcode 项目。作为该项目的一部分,我实现了一个新类来存储数据。它应该允许访问许多类变量。.h 文件只是简单地声明了如下所示的方法。.m 文件具有以下内容。问题是 xcode 发出警告说“没有用于“setNameString1:”的设置方法来分配给属性”。我找不到不涉及“[nameString1 release];”的设置器 因为我使用的是 ARC,所以我不能用它来清除字符串。我知道 setter 方法不完整,但我想在填写其余内容之前了解这个问题。

@interface data_storage ()
{

}

+ (NSString *) nameString1;
+ (NSString *) nameString2;
+ (NSString *) nameString3;
+ (NSString *) nameString4;
+ (NSString *) nameString5;
+ (NSString *) nameString6;
@end

@implementation data_storage
+ (NSString *) getter : (int)stringNumber {
    switch (stringNumber) {
        case 1:
            return data_storage.nameString1;
        case 2:
            return data_storage.nameString2;
        case 3:
            return data_storage.nameString3;
        case 4:
            return data_storage.nameString4;
        case 5:
            return data_storage.nameString5;
        case 6:
            return data_storage.nameString6;

        default:
            return nil;
    }
}
+ (void) setter:(int)stringNumber string:(NSString *)nameString {
    switch (stringNumber) {
        case 1:
            data_storage.nameString1 = nameString;
            break;
        case 2:
            data_storage.nameString2 = nameString;
            break;
        default:
            break;
    }
}
@end
4

1 回答 1

2

嗯,嗯。绝对有趣,你想在这里做什么。你来自什么编程语言?

您具体看到的错误“'setNameString1' 没有设置方法”,是因为名为 nameString1 的变量没有设置方法。实际上,没有任何属性或 ivars 称为 nameString1,这更多的是问题所在。

当你这样做时:+ (NSString *) nameString1;你实际上并没有声明一个变量;您正在声明一个类方法。要声明一个类变量,我见过的通常的 Objective-C 技术是使用一个静态变量,a lastatic NSString *classString = @"This is a class-level string variable!"; 这就是我一直做类级变量的方式,在极少数情况下我需要这样做,而这里似乎有其他人也这样做。正如他在链接中所说,Objective-C 确实没有类级变量的概念。

现在,你声明了这个“类变量”,你可以为它创建一个 getter 和 setter,这就是你的类级方法的用武之地。我想它会是这样的:

+ (NSString *)classString {
    return classString;
}

+ (void)setClassString:(NSString *)newString {
    classString = newString;
}

在那里,你有类级别的 getter 和 setter!现在,您可能还想classString = [newString copy]在您的 setter 方法中执行操作,实际上,我不确定 ARC 如何处理此类事情,但我认为您的内存管理都将为您处理。

现在,这是否有点说明问题?

更进一步,你有这些......切换 setter 和 getter,它们接受一个 int 参数。那么,现在你在这些方法中做了什么?你正在做return data_storage.nameString1;or data_storage.nameString1 = nameString;,它们本身就是 getter 和 setter。请记住:

return data_storage.nameString1==return [data_storage nameString1]data_storage.nameString1 = nameString==[dataStorage setNameString1:nameString]

点语法很简洁,它在调用方法。现在再看看你的类——你有每个类的方法定义吗?你没有,这就是你的“'setNameString1'没有设置方法”错误的来源。


好的,现在,抛开所有这些,我认为您也许应该重新考虑一下您将如何处理这件事。你想达到什么目的?您想要一个包含某种数据的对象,并且您认为您想要一个类,因为您只希望这些对象中的一个存在?在这种情况下,您应该使用单例! 是一个很好的示例代码, 是一个教程,您可以使用 Google 查找更多信息。让我知道是否需要澄清。

于 2013-07-13T01:54:29.460 回答