为了账号安全,请及时绑定邮箱和手机立即绑定

属性与实例变量

属性与实例变量

Cats萌萌 2019-11-12 11:21:14
我正在尝试了解某些人如何使用策略来区分实例变量与属性。常见的模式如下:@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。为什么会这样?谢谢。
查看完整描述

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


查看完整回答
反对 回复 2019-11-12
?
哈士奇WWW

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一段时间之后,很明显。


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 529 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信