属性与实例变量

我正在尝试了解某些人如何使用策略来区分实例变量与属性。常见的模式如下:


@interface MyClass : NSObject {

    NSString *_myVar;

}


@property (nonatomic, retain) NSString *myVar;

@end


@implementation MyClass

@synthesize myVar = _myVar;

现在,我认为此策略背后的整个前提是使人们可以轻松区分ivar和属性之间的区别。因此,如果我想使用由综合属性继承的内存管理,则可以使用以下方法:


myVar = @"Foo";

另一种方法是通过self。[ivar / property here]引用它。


使用@synthesize myVar = _myVar策略的问题是我发现编写如下代码:


myVar = some_other_object; // doesn't work. 

编译器抱怨未声明myVar。为什么会这样?


谢谢。


Cats萌萌
浏览 483回答 3
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

哈士奇WWW

通常,我将属性的名称与实例变量的名称相同。这是@property语法的默认假设。如果发现自己正在使用默认值,那说明您做错了(或您的框架sux,我认为Cocoa / Cocoa-touch并非如此)。您遇到的编译器错误是因为使用属性始终必须有一个对象引用,即使在您自己的类实现中也是如此:self.stuff = @"foo"; // property setter[stuff release]; // instance variablestuff = @"bar"; // instance variablereturn 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一段时间之后,很明显。
打开App,查看更多内容
随时随地看视频慕课网APP