安装NSString

时间:2013-07-13 01:12:32

标签: objective-c nsstring

我是Objective-C的新手,正在尝试一个简单的xcode项目。作为该项目的一部分,我实现了一个新类来存储数据。它应该允许访问许多类变量。 .h文件只是声明方法如下所示。 .m文件具有以下内容。问题是xcode给出了一个警告:“setNameString1:”用于赋值给属性'没有setter方法'。我找不到一个不涉及'[nameString1 release];'的setter'因为我使用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

1 个答案:

答案 0 :(得分:2)

嗯,好吧。绝对有趣,你在这里尝试做什么。你来自哪种编程语言?

您明确看到的错误“没有'setNameString1'的setter方法”,因为没有名为nameString1的变量的setter。事实上,没有名为nameString1的属性或ivars,这就是问题所在。

执行此操作时:+ (NSString *) nameString1;您实际上并未声明变量;您正在声明类方法。要声明一个类变量,我所见过的常用Objective-C技术是使用一个静态变量,一个la static NSString *classString = @"This is a class-level string variable!";这就是我总是在我需要的极少数情况下完成类级变量的方法,而here其他人似乎也这样做了。正如他在链接中所说,Objective-C无论如何都没有类级变量的概念。

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

+ (NSString *)classString {
    return classString;
}

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

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

现在,这会对事情有所启发吗?

更进一步,你有这些...切换设置器和getter,它们采用int参数。那么,现在你在这些方法中做了什么?你正在做return data_storage.nameString1;data_storage.nameString1 = nameString;,它们本身就是吸气者和制定者。请记住:

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

点语法很简洁,它在调用方法的引擎盖下。现在再看一下你的课程 - 你们每个人都有方法定义吗?你不这样做,那就是你的'setNameString1'错误的“setterter方法”来自哪里。


好的,现在,除此之外,我想你应该重新思考一下你是怎么回事。你想达到什么目的?您需要一个包含某种数据的对象,而您认为您想要一个类,因为您只希望一个这些对象存在?在这种情况下,你应该使用单身人士! Here是一小段示例代码,here 是一个教程,您可以使用谷歌查找更多信息。如果我需要澄清,请告诉我。