使用[self setVariable:value] vs variable = value

时间:2012-07-02 15:20:55

标签: objective-c

在Objective C中,我希望使用[self setVariable:value];而不是variable = value;

好像做了自我设置我节省了几行代码,但还有其他什么优点?另外,我什么时候不想做自我设定?

3 个答案:

答案 0 :(得分:3)

修改: 我应该澄清一点,我在下面引用的内容严格来说就是属性变量。如果变量只是一个ivar,那么self.variable = valuevariable = value之间没有区别,除了self.variable = value如果它只是一个ivar就不会编译的事实,在这种情况下你需要使用self->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被取消分配,则指向该对象的指针不再有效。

答案 1 :(得分:1)

使用setter over value to value to variable的主要原因是实现Encapsulation。

一些好处是 -

  1. 使用获取或设置属性进行封装可以在以后更轻松地添加其他功能(如验证)。
  2. 隐藏实例变量。
  3. 有效的内存管理。

答案 2 :(得分:0)

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

MyObject.h:

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

@end

MyObject.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

对于不需要内存管理的intfloat等数据类型,您可以在不使用setter / getter方法的情况下离开,但是最好将它们全部用于时间。