3 回答
TA贡献1895条经验 获得超3个赞
属性只是用于的setter和getter,ivars并且(几乎)应该始终使用它们,而不是直接访问。
@interface APerson : NSObject {
// NSString *_name; // necessary for legacy runtime
}
@property(readwrite) NSString *name;
@end
@implementation APerson
@synthesize name; // use name = _name for legacy runtime
@end
@synthesize 在这种情况下,会创建这两种方法(并非100%准确):
- (NSString *)name {
return [[_name copy] autorelease];
}
- (void)setName:(NSString *)value {
[value retain];
[_name release];
_name = value;
}
现在很容易区分ivars和获取器/设置器。访问器已获得self.前缀。无论如何,您都不应该直接访问变量。
您的示例代码无效,因为它应该是:
_myVar = some_other_object; // _myVar is the ivar, not myVar.
self.myVar = some_other_object; // works too, uses the accessors
TA贡献1799条经验 获得超6个赞
通常,我将属性的名称与实例变量的名称相同。这是@property语法的默认假设。如果发现自己正在使用默认值,那说明您做错了(或您的框架sux,我认为Cocoa / Cocoa-touch并非如此)。
您遇到的编译器错误是因为使用属性始终必须有一个对象引用,即使在您自己的类实现中也是如此:
self.stuff = @"foo"; // property setter
[stuff release]; // instance variable
stuff = @"bar"; // instance variable
return self.stuff; // property getter
我知道许多可可程序员不同意这一点,但是我认为在类实现中使用属性是一种不好的做法。我宁愿看到这样的事情:
-(void) someActionWithStuff: (NSString*) theStuff {
// do something
[stuff release];
stuff = [theStuff copy];
// do something else
}
比这个:
-(void) someActionWithStuff: (NSString*) theStuff {
// do something
self.stuff = theStuff;
// do something else
}
我更喜欢尽可能明确地进行内存管理。但是,即使您不同意,使用该self.stuff表单也可以在任何经验丰富的Objective-C程序员中暗示您正在调用属性而不是访问实例变量。对于初学者来说,这是一个很容易理解的精妙之处,但是在使用Objective-C 2.0一段时间之后,很明显。
- 3 回答
- 0 关注
- 529 浏览
添加回答
举报