2

在Objective C中,我想使用什么场景[self setVariable:value];而不是variable = value;

似乎做一个自我设置我为自己节省了几行代码,但还有什么其他优点呢?另外,我什么时候不想做自我设定?

4

3 回答 3

3

编辑:我应该澄清一下,我在下面引用的内容严格涉及作为属性的变量。self.variable = value如果一个变量只是一个 ivar,那么or之间没有区别,除了如果它只是一个 ivar 甚至不会编译variable = value的事实,在这种情况下你需要使用self.variable = valueself->variable = value

打电话

[self setVariable:value];

和调用一样

self.variable = value;

然而,

variable = value;

前两种情况使用综合setVariable方法(或您自己定义的方法)。您想要使用它的原因是确保您对对象保持正确的保留计数。

例如,一个简单的属性,例如:

@property (retain) NSString *myString;

获取一个自动生成的 set 函数,如下所示:

-(void) setMyString:(NSString*)other
{
    myString = [other retain];
}

如果你只是打电话

myString = otherString;

代码中的其他地方,则myString没有正确保留,因此如果otherString被释放,则指向该对象的指针不再有效。

于 2012-07-02T15:30:46.850 回答
1

使用setter而不是给变量赋值的主要原因是为了实现封装。

一些好处是 -

  1. 获取或设置属性的封装允许以后更容易地添加附加功能(如验证)。
  2. 隐藏实例变量。
  3. 有效的内存管理。
于 2012-07-02T15:28:51.013 回答
0

在持有需要保留和释放的对象时,您肯定需要使用它以符合 Objective-C 内存管理模型。例如:

我的对象.h:

@interface MyObject : NSObject
{
    NSString *_name;
}
@property (retain, nonatomic, readwrite) NSString *name;

@end

我的对象.m:

@implementation MyObject

@synthesize name = _name;

- (id)init
{
    self = [super init];
    if (self != nil)
    {
        self.name = [NSString stringWithFormat:@"name:%d", 12];
    }
    return self;
}

- (void)dealloc
{
    self.name = nil;
    [super dealloc];
}

@end

对于, 等不需要内存管理的数据类型int,您可以不使用 setter/getter 方法而摆脱困境,但是始终使用它们是一种好习惯。float

于 2012-07-02T15:28:39.250 回答