Objective c 我是否也需要在实例变量部分声明属性?我能得到什么?

Objective c 我是否也需要在实例变量部分声明属性?我能得到什么?,objective-c,Objective C,我在这里读了一些关于属性的教程,但我仍然有一些疑问需要澄清,它们之间有区别吗 @interface MyClass : NSObject { } @property(nonatomic,retain) NSString *temp; @end 及 第一个有效吗?如果没有实例变量,那么要有一个属性来访问它就有点困难 @属性是为您准备的,因此您可以懒惰,它们为您编写以下两种方法(如果未设置为只读): 它还允许您使用“someClass.itsVariable;”而不是“[someClass

我在这里读了一些关于属性的教程,但我仍然有一些疑问需要澄清,它们之间有区别吗

@interface MyClass : NSObject {    
}
@property(nonatomic,retain) NSString *temp;
@end


第一个有效吗?如果没有实例变量,那么要有一个属性来访问它就有点困难

@属性是为您准备的,因此您可以懒惰,它们为您编写以下两种方法(如果未设置为只读):

它还允许您使用“someClass.itsVariable;”而不是“[someClass.itsVariable]”

另外,当您创建头文件时,确保最大的变量(如指针)在顶部,最小的在底部,这样可以节省ram

因此:

而不是:

BOOL fakeBool;
NSObject *someObject;
short aShort;
NSObject *someOtherObject;
int anInt;

这与编译器有关,您可以使用sizeof()检查这一点。区别在于,在第一个版本中,编译器将自动创建一个实例变量(IIRC,它将命名为
\u temp
,但我不确定)。这仅在iOS和Mac 64位上受支持

在第二个示例中,您提供了变量

实际上,有一种方法可以告诉编译器属性使用哪个变量,我经常使用:

@interface MyClass : NSObject {
    NSString *temp_;
}
@property(nonatomic,retain) NSString *temp;
@end

@implementation MyClass
@synthesize temp = temp_;
@end
这样,变量和属性具有不同的名称,您就不能混淆它们(例如,忘记前缀
self.

次要注意事项:对于
NSString*
,通常需要使用
copy
而不是
retain
,因为您可能会将
NSMutableString*
分配给属性。现在,如果您要更改可变字符串,可能会发生意外情况。

在现代运行时(Objective-C2.0)中,这是相同的,因为编译器将为您生成变量。看

引用Objective-C编程语言>声明的属性>:

访问器合成的行为存在差异 取决于运行时:

  • 对于遗留运行时,实例变量必须已经在当前类的@interface块中声明。如果一个实例 存在与属性同名的变量,如果其类型为 与属性的类型兼容,否则将使用它,您将获得 编译器错误

  • 对于现代运行时,根据需要合成实例变量。如果已存在同名的实例变量,则为 用过


我发现的实际区别是,调试器似乎没有向您显示属性的值,只是显示实例变量

因此,您的第一个示例(假设您使用
@synthesis
指令来创建getter/setter)自动创建ivar,它不会具有您在调试期间可以轻松检索的值。您将不得不发送大量的
NSLog
消息,而不仅仅是在单步执行代码时查看值

另一方面,这似乎与本主题有关,我通常在ivar前面加上“iv”,并在XCode首选项中更改颜色设置,这样我就永远不会不确定是访问属性还是ivar

示例

@interface MyClass : NSObject {
    NSString *ivName;
    NSString *ivTitle;
}
@property (nonatomic, copy) NSString *Name;
@property (nonatomic, copy) NSString *Title;
@end
现在,在合成属性时,这需要一个小技巧(将两者结合在一起),我将在下面展示:

@implementation MyClass
@synthesize Name = ivName;
@synthesize Title = ivTitle;

通过这种方式,我总是很容易一眼就知道到底发生了什么。是的,上下文还可以告诉您是否正在访问ivar/属性,但为什么不让它变得更简单?

很抱歉,我尝试了,但未能将代码设置为正确的格式。我试着把它放进去,但还是没用。我不知道怎么做。有什么提示吗?你不必把代码放在{}中。您可以粘贴代码,选择它并单击{},这是文本字段上方的一个按钮。@codo谢谢,现在我知道了。很抱歉,我试图像cocos2d论坛那样做。@Rajashekar供您参考,如果您在帖子中添加“objective-c”标记,它将用objective-c语言对帖子进行语法高亮显示/颜色编码。是的,第一个可以在iOS和Mac 64位上使用,但不能在Mac 32位上使用。编译器会为您生成一个实例变量。顺便说一句,我不相信你关于节省空间的评论是真的,你能用一些链接来支持吗?因为编译器应该以CPU方便的方式对齐变量,并且重新排序不会改变所用的空间量。@DarkDust尝试一下,然后找到它,这是真的。使用sizeof()@DarkDust当我有两个NSStrings没有顶部,底部有两个布尔值时,它的大小是32,当我以随机顺序执行它们时,它是布尔指针布尔值40@Antwanvan Houdt,是的,它确实能工作,我不确定它在哪种情况下能工作(比如在iOS和Mac 64位上,但在Mac 32位上不行)。@Antwan van Houdt:非常有趣,谢谢你让我知道。
@interface MyClass : NSObject {
    NSString *temp_;
}
@property(nonatomic,retain) NSString *temp;
@end

@implementation MyClass
@synthesize temp = temp_;
@end
@interface MyClass : NSObject {
    NSString *ivName;
    NSString *ivTitle;
}
@property (nonatomic, copy) NSString *Name;
@property (nonatomic, copy) NSString *Title;
@end
@implementation MyClass
@synthesize Name = ivName;
@synthesize Title = ivTitle;