gpt4 book ai didi

ios - Objective C 中的@dynamic 属性

转载 作者:行者123 更新时间:2023-11-28 18:08:36 25 4
gpt4 key购买 nike

我正在尝试在我的项目中实现动态属性这是我的代码。

MyClass.h

@interface MyClass : UIView

@property (strong, nonatomic) NSString *name;

@end

MyClass.m

@implementation MyClass

@dynamic name;

-(void)setName:(NSString *)name{
self.name = name;
}
@end

但是当我运行我的应用程序时,它崩溃了。

enter image description here

当我使用 ivar 时出现此错误。 enter image description here

最佳答案

属性只是两个方法的组合:getter 和 setter。所以,当你写

@property (strong, nonatomic) NSString *name;

你说的是真的

- (NSString *)name;
- (void)setName:(NSString *)name;

之后,编译器每次遇到obj.name 形式的表达式时,都会将其转换为[obj name]。每次您看到类似 obj.name = @"hello"; 的语句时,编译器都会将其翻译为 [obj setName:@"hello"]

接下来您必须确保该属性的行为正常。您有多种选择:

  • 手动编写 getter 和 setter,引用 iVar
  • 综合 getter 和 setter
  • 自动合成 getter 和 setter
  • 编写自定义 getter 和 setter
  • 使用@dynamic 避免编译时警告,因为您打算执行运行时魔术。 (真的,这不是您想要做的,因为您需要先了解基础知识。)

手动编写 getter 和 setter,引用一个 iVar

@interface MyClass : UIView {
NSString *_name;
}

@property (strong, nonatomic) NSString *name;

@end

并在实现中

@implementation MyClass

- (NSString *)name {
return _name;
}
- (void)setName:(NSString *)name {
_name = name;
}

@end

综合getter和setter

最后一节基本等同于此

@interface MyClass : UIView {
NSString *_name;
}

@property (strong, nonatomic) NSString *name;

@end

@implementation MyClass

@synthesize name = _name;

@end

自动合成 getter 和 setter

在实践中,您只需使用“自动合成”。

@interface MyClass : UIView

@property (strong, nonatomic) NSString *name;

@end

@implementation MyClass

@end

这意味着,

  • 如果你只是声明一个属性
  • 不要调用@synthesize@dynamic
  • 不要实现任何自定义的 getter 和 setter

上面的代码只会创建一个名为 _name 的 iVar 和一个与第一个示例中的完全一样的 getter 和 setter。

这意味着前两部分和这部分是等价的,因为它们产生相同的代码。

编写自定义 getter 和 setter

这就是术语“动态属性”的真正含义。例如,您可能希望名称始终大写。所以你可以这样写一个属性。

@interface MyClass : UIView {
NSString *_name;
}

@property (copy, nonatomic) NSString *name;

@end

@implementation MyClass

- (NSString *)name {
return _name;
}

- (void)setName:(NSString *)name {
_name = [name uppercaseString];
}

@end

(在上面的代码中,我将 strong 更改为 copy - 别担心,这只是一条注释。而且它是真实的,因为 uppercaseString 永远不会相同,它永远是原始的副本。)

这可能是唯一真正有趣的案例了!例如,这种属性是 UIKit 一直使用的,例如UILabeltext 属性就是这样的动态属性。它不仅会设置一些 iVar,还会确保屏幕上的可见文本也会发生变化。

@dynamic 属性

要正确处理它们真的很棘手,恕我直言,大多数时候它们不值得麻烦。

注意:我简化了一些事情并省略了只有在使用 objc 运行时检查 API 时才能检测到的细节

关于ios - Objective C 中的@dynamic 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52376315/

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