在Objective C中,我想使用什么场景[self setVariable:value];
而不是variable = value;
似乎做一个自我设置我为自己节省了几行代码,但还有什么其他优点呢?另外,我什么时候不想做自我设定?
在Objective C中,我想使用什么场景[self setVariable:value];
而不是variable = value;
似乎做一个自我设置我为自己节省了几行代码,但还有什么其他优点呢?另外,我什么时候不想做自我设定?
编辑:我应该澄清一下,我在下面引用的内容严格涉及作为属性的变量。self.variable = value
如果一个变量只是一个 ivar,那么or之间没有区别,除了如果它只是一个 ivar 甚至不会编译variable = value
的事实,在这种情况下你需要使用self.variable = value
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
被释放,则指向该对象的指针不再有效。
使用setter而不是给变量赋值的主要原因是为了实现封装。
一些好处是 -
在持有需要保留和释放的对象时,您肯定需要使用它以符合 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