我一直无法找到关于这个主题的任何信息,而且我所知道的大部分内容都是完全意外发生的(并且几个小时试图找出我的代码无效的原因).在学习objective-c的大多数教程时,我发现使用相同的名称创建变量和属性.我不明白它的意义,因为看起来该属性完成了所有的工作,变量只是坐在那里.例如:
Test.h
@interface Test : NSObject {
int _timesPlayed, _highscore;
}
@property int timesPlayed, highscore;
// Methods and stuff
@end
Run Code Online (Sandbox Code Playgroud)
Test.m
@implementation Test
@synthesize timesPlayed = _timesPlayed;
@synthesize highscore = _highscore;
// methods and stuff
@end
Run Code Online (Sandbox Code Playgroud)
我知道的
1)好的,今天我发现(经过几个小时的混乱),无论你对属性做了多少改变,highscore = 5091231当你试图调用[测试高分]时它不会改变任何东西,因为它仍将返回_highscore的值(我认为)是在test.h中设置的ivar.因此,test.m中所有变量的变化都需要改变_highscore而不是highscore.(如果我错了,请纠正我)
2)如果我理解正确(我可能不这样做),test.h中设置的ivars代表实际内存,因为@properties只是访问该内存的方式.因此,在实现之外,我无法通过该属性访问_highscore.
我不明白
基本上我不了解这种情况是我是否需要使用ivars或者我是否可以使用@property和@synthesize.似乎ivars只是额外的代码,除了让我困惑之外什么都不做.我见过的一些最近的tuts似乎没有使用ivars,但有些人做了.那么这只是编码偏好的事情还是实际上很重要?我试过通过Apple的文档搜索,但我在那里相当迷失,似乎永远不会找到我正在寻找的东西.任何指导将不胜感激.
我倾向于在我的类中专门使用属性,特别是现在您可以在类扩展中声明属性,这要归功于现代的Objective-C 2.0运行时 - 我使用此功能来创建"私有"属性.
我的问题是,是否有任何理由再次在类接口中声明ivars.我更喜欢面向公众的界面尽可能地简洁和干净,只是揭示我班级中相关的方面.
例如,我倾向于做以下事情:
MyClass.h:
@interface MyClass : NSObject
@property (nonatomic, copy) NSString * publicString;
@property (nonatomic, copy, readonly) NSString * readOnlyString;
@end
Run Code Online (Sandbox Code Playgroud)
MyClass.m:
@interface MyClass ()
@property (nonatomic, copy, readwrite) NSString * readOnlyString;
@property (nonatomic, copy) NSString * privateString;
@end
@implementation MyClass
@synthesize publicString = publicString_;
@synthesize readOnlyString = readOnlyString_;
@synthesize privateString = privateString_;
- (void)init
{
self = [super init];
if (self != nil)
{
self.publicString = @"Public String";
self.readOnlyString = @"Read-Only String";
self.privateString …Run Code Online (Sandbox Code Playgroud)