当前位置:  开发笔记 > 编程语言 > 正文

Objective-C属性赋值返回赋值?

如何解决《Objective-C属性赋值返回赋值?》经验,为你挑选了1个好方法。

说我有以下内容:

@interface MyClass : NSObject { NSString* _foobar; }
@property (nonatomic, retain) NSString* foobar;
@end

@implementation MyClass
@dynamic foobar;
- (void) setFoobar:(NSString*)fbSet; { [_foobar release]; _foobar = [fbSet retain]; }
- (NSString*) foobar; { return _foobar; }
@end

然后:

MyClass* mcInst = [[[MyClass alloc] init] autorelease];
NSLog(@"I set 'foobar' to '%@'", (mcInst.foobar = @"BAZ!"));

查看返回值-[MyClass setFoobar:],可以假设此行将打印I set 'foobar' to '',因为赋值似乎不返回任何内容.

但是 - 幸运的是 - 这个赋值按预期运行,代码打印出来I set 'foobar' to 'BAZ!'.不幸的是,这感觉就像一个矛盾,因为调用的setter的返回值掩盖了赋值返回赋给它的值的事实.起初我认为这mcInst.foobar = @"BAZ!";是两个调用而不是一个块:首先是setter,然后是getter来收集返回值.但是,通过NSLog调用检测setter和getter方法证明情况并非如此.



1> e.James..:

快速摘要:

这里的快速回答是没有矛盾,因为表达式的结果:

(mcInst.foobar = @"BAZ!")

实际上@"BAZ!",而不是 mcInst.foobar.

下面提供了更多详细信息,但可能有助于考虑对您的setFoobar方法进行以下修改:

- (void) setFoobar:(NSString*)fbSet
{
    [_foobar release];
    _foobar = [[NSString stringWithFormat:@"HELLO_%@", fbSet] retain];
}

使用此代码,在设置foobar属性时会修改属性的值,但您的代码行仍将显示值"BAZ!" .

细节:

正如newacct所指出的,你的NSLog代码是有效的,因为你使用赋值运算符(=),它在C语言中有一些非常特殊的行为(Objective-C基于它)

在C中,您可以执行以下操作:

x = y = z = 42;

和所有的变量,x,yz将持有的价值42.

编译器通过使用临时变量(*)来处理此行为.基本上,幕后发生的事情看起来像这样:

tempVar = 42;
z = tempVar;
y = tempVar;
x = tempVar;

同样,您可以执行以下操作:

SomeFunction(x = 42);

这行代码会将42的值复制到x中,然后SomeFunction使用参数42 进行调用.在幕后,它看起来像这样:

tempVar = 42;
x = tempVar;
SomeFunction(tempVar);

现在,在Objective-C中,您的日志记录行按如下方式处理:

tempVar = @"BAZ!";
[mcInst setFooBar:tempVar];
NSLog(@"I set 'foobar' to '%@'", tempVar);

(*)请注意,我描述的"temporaray变量"的用法是为了说明这个概念,并且可能实际上并不反映任何给定的编译器实际上做了什么.这种实现细节取决于编写编译器的程序员,每个人都可以做一些不同的事情.然而,最终结果是一样的.

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