当前位置:  开发笔记 > 前端 > 正文

属性与实例变量

如何解决《属性与实例变量》经验,为你挑选了3个好方法。

我试图理解一些人用来区分实例变量和属性的策略.常见的模式如下:

@interface MyClass : NSObject {
    NSString *_myVar;
}

@property (nonatomic, retain) NSString *myVar;
@end

@implementation MyClass
@synthesize myVar = _myVar;

现在,我认为这个策略背后的整个前提是可以很容易地区分出伊达和财产之间的区别.所以,如果我想使用由合成属性继承的内存管理,我会使用如下内容:

myVar = @"Foo";

另一种方式是通过自我引用它.[ivar/property here].

使用@synthesize myVar = _myVar策略的问题是,我认为编写代码如:

myVar = some_other_object; // doesn't work. 

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

谢谢.



1> Georg Schöll..:

属性只是设置器和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和getter/setter.访问者已获得self.前缀.您不应该直接访问变量.


您的示例代码不能正常工作:

_myVar = some_other_object;      // _myVar is the ivar, not myVar.
self.myVar = some_other_object;  // works too, uses the accessors


正式参加WWDC 2012视频会议405 - 现代Obj-C约11分钟.属性声明就是您所需要的,并且您可以免费获得合成,并且后备实例变量被强调.
不要复活一篇旧帖子,但当我看到这个问题时,我想知道这个话题.这似乎是一个很好的解释,但对于一个令我印象深刻的情况.如果我执行类似`[someObject.someArray addObject:anotherObject]`的操作,那是不是意味着将对象`anotherObject`添加到数组`someArray`的临时副本中并且不会影响实际属性?
实际上你关于_myVar由Apple保留的陈述是100%错误的,而Mountain Lion将是默认的合成行为,让支持ivar为_ivar.您正在考虑Apple说不使用的_methodName.
@Lucas:你说得对.我要改变它.对于对此感兴趣的每个人,Apple甚至[鼓励下划线](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html).

2> rincewind..:

命名的合成属性prop实际上由两个方法prop(返回属性的当前值)和setProp:(为prop设置新值)表示.

self.prop语法是调用这些访问的一个语法糖.在您的示例中,您可以执行以下任一操作来设置属性myVar:

self.myVar = @"foo"; // handles retain/release as specified by your property declaration
[self setMyVar: @"foo"]; // handle retain/release
_myVar = @"Foo"; // does not release old object and does not retain the new object

要访问属性,请使用self.propname.要访问实例变量,只需使用实例变量的名称.



3> Peter Hosey..:

使用@synthesize myVar = _myVar策略的问题是,我认为编写代码如:

myVar = some_other_object; // doesn't work.

编译器抱怨myVar未申报.为什么会这样?

因为变量myVar是未声明的.

该语句使用语法来访问变量,无论是实例变量还是其他类型.正如rincewind告诉你的那样,要访问属性,必须使用property-access语法(self.myVar = someOtherObject)或显式消息来访问者方法([self setMyVar:someOtherObject]).

否则,您正在尝试访问变量,并且由于您没有命名变量myVar,因此您尝试访问不存在的变量.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有