我是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
答案 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 是一个教程,您可以使用谷歌查找更多信息。如果我需要澄清,请告诉我。