相关疑难解决方法(0)

在目标c中使用ivars vs属性的原因

我一直无法找到关于这个主题的任何信息,而且我所知道的大部分内容都是完全意外发生的(并且几个小时试图找出我的代码无效的原因).在学习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的文档搜索,但我在那里相当迷失,似乎永远不会找到我正在寻找的东西.任何指导将不胜感激.

properties objective-c ivar

21
推荐指数
2
解决办法
1万
查看次数

如果您在Objective-C中仅使用属性,是否有任何理由声明ivars?

我倾向于在我的类中专门使用属性,特别是现在您可以在类扩展中声明属性,这要归功于现代的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)

properties objective-c instance-variables

9
推荐指数
1
解决办法
1930
查看次数