Objective c NSString的Setter

Objective c NSString的Setter,objective-c,nsstring,Objective C,Nsstring,我对Objective-C非常陌生,正在尝试一个简单的xcode项目。作为这个项目的一部分,我实现了一个新类来存储数据。它应该允许访问许多类变量。.h文件只是声明了下面的方法。.m文件包含以下内容。问题是xcode给出了一个警告,即“setNameString:“for assignment to property”没有setter方法。我找不到一个不涉及“[nameString1发行版];”的setter因为我使用的是弧,所以我不能用它来清除字符串。我知道setter方法不完整,但我想在填写其

我对Objective-C非常陌生,正在尝试一个简单的xcode项目。作为这个项目的一部分,我实现了一个新类来存储数据。它应该允许访问许多类变量。.h文件只是声明了下面的方法。.m文件包含以下内容。问题是xcode给出了一个警告,即“setNameString:“for assignment to property”没有setter方法。我找不到一个不涉及“[nameString1发行版];”的setter因为我使用的是弧,所以我不能用它来清除字符串。我知道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

嗯,嗯。很有趣,你想在这里做什么。你来自哪种编程语言

您特别看到的错误是,“setNameString1”没有setter方法,这是因为名为nameString1的变量没有setter。事实上,没有称为nameString1的属性或IVAR,这是一个更大的问题

执行此操作时:
+(NSString*)nameString1您实际上并没有声明变量;您正在声明一个类方法。要声明一个类变量,我见过的常用Objective-C技术是使用一个静态变量,即la
static NSString*classString=@“这是一个类级别的字符串变量!”这就是我一直在做类级变量的方式,在我需要做的极少数情况下,其他人似乎也这样做。正如他在链接中所说,Objective-C实际上没有类级变量的概念

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

+ (NSString *)classString {
    return classString;
}

+ (void)setClassString:(NSString *)newString {
    classString = newString;
}
在那里,你有类级别的getter和setter!现在,您可能还想在setter方法中执行
classString=[newString copy]
,实际上,我不确定ARC是如何处理这类事情的,但我认为您的内存管理都将为您处理

现在,这能说明一些事情吗

更进一步,你有这些…交换setter和getter,它们接受int参数。那么,现在你在这些方法中做什么?您正在执行
返回数据\u storage.nameString1
数据存储.nameString1=nameString,它们本身就是getter和setter。请记住:

返回数据存储名称字符串1
==
返回[数据存储名称字符串1]
data\u storage.nameString1=nameString
=
[dataStorage setNameString1:nameString]

dot语法非常简洁,它在幕后调用方法。现在再看看你的类——你有每个类的方法定义吗?您不需要,这就是您的“setNameString1'的无setter方法”错误的来源


好吧,现在,抛开这些,我想你应该重新考虑一下你是怎么做的。你想完成什么?您想要一个包含某种数据的对象,并且您认为您想要一个类,因为您只希望这些对象中的一个存在?在这种情况下,您应该使用单例!是一个很好的示例代码,
这是一个教程,你可以使用谷歌查找更多信息。如果需要澄清,请告诉我。

在尝试编写更多Objective-C之前,您需要阅读更多内容。尤其是,请阅读“属性”。使用“属性”,您可以让编译器为您生成getter和setter(还要了解,您在上面定义类方法(
+
前缀),并且它们本身没有访问类对象中任何数据的权限。)投票关闭,因为这不会导致任何结果。。。