gpt4 book ai didi

Objective-C - 未使用下划线 ivar 合成的只读属性?

转载 作者:太空狗 更新时间:2023-10-30 03:10:07 24 4
gpt4 key购买 nike

如果我理解正确的话,在 Objective-C 中,属性会自动与 getter 和 setter 合成,实例变量声明为带有下划线前缀的属性名称 (_ivar)。

所以,这段代码:

主.m

#import <Foundation/Foundation.h>
#import "hello.h"

int main(int argc, char *argv[])
{

@autoreleasepool {

Hello *hello = [[Hello alloc] init];
NSLog(@"%@", hello.myString);

return 0;

}

}

你好.h

#import <Foundation/Foundation.h>

@interface Hello : NSObject
@property (copy, nonatomic) NSString *myString;
@end

你好.m

#import "hello.h"

@implementation Hello

-(Hello *)init
{

if (self = [super init]) {
_myString = @"Hello";
}

return self;

}

-(NSString *)myString
{
return [NSString stringWithFormat:@"%@ %@", _myString, @"World"];
}

@end

可以这样编译运行:

bash-3.2$ clang -framework Foundation main.m hello.m -o hello
bash-3.2$ ./hello
2013-05-27 13:20:39.738 hello[23320:707] Hello World

现在,当我像这样将 myString 属性更改为只读时:

@property (readonly, copy, nonatomic) NSString *myString;

然后当我尝试编译时出现错误:

hello.m:11:9: error: unknown type name '_myString'; did you mean 'NSString'?
_myString = @"Hello";
^~~~~~~~~
NSString

所以 _myString 没有定义。编译器没有用实例变量 _myString 合成属性吗?自己合成看看能不能用:

在 hello.m 实现中:

@synthesize myString = _myString;

现在它再次起作用了:

bash-3.2$ clang -framework Foundation main.m hello.m -o hello
bash-3.2$ ./hello
2013-05-27 13:36:59.916 hello[24219:707] Hello World

所以,我的问题是,当您在属性上使用 readonly 时,为什么它不会自动合成带有下划线的 ivar?还是我完全理解 Objective-C 的工作原理是错误的?

非常感谢解释性的回答,因为我真的很想了解到底发生了什么以及为什么。

提前谢谢你。

最佳答案

如果您实现所有必需的访问器方法(只读属性的 getter,读写属性的 getter + setter),属性不会自动合成

因为你为只读属性实现了getter方法-(NSString *)myString,它不是自动合成的。如果你的 getter 需要一个实例变量来备份属性值,你必须添加合成语句(就像你所做的那样)或一个实例变量。

关于Objective-C - 未使用下划线 ivar 合成的只读属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com