目标C中的@dynamic属性

JosuéH.

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

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

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

在此处输入图片说明

当我使用ivar时出现此错误。 在此处输入图片说明

麦可

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

@property (strong, nonatomic) NSString *name;

你真正在说的是

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

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

接下来的事情是您必须确保属性运行正常。您有很多选择:

  • 手动编写获取器和设置器,参考iVar
  • 合成吸气剂和设定器
  • 自动合成吸气剂和设定器
  • 编写自定义的getter和setter
  • 使用@dynamic以避免编译时警告,因为你打算做运行时技巧。(确实,这不是您想要做的,因为您需要首先了解基础知识。)

手动编写获取器和设置器,参考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

合成吸气剂和设定器

最后一部分基本上等于

@interface MyClass : UIView {
    NSString *_name;
}

@property (strong, nonatomic) NSString *name;

@end

@implementation MyClass

@synthesize name = _name;

@end

自动合成吸气剂和设定器

实际上,您将只使用“自动合成”。

@interface MyClass : UIView

@property (strong, nonatomic) NSString *name;

@end

@implementation MyClass

@end

这意味着,

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

上面的代码将只创建一个名为iVar的_name,一个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

(在上面的代码中,我更改strongcopy-不用担心,无论如何这只是一条注释。这是一个真实的注释,因为uppercaseString将永远不会相同,它将始终是原始注释的副本。)

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

@dynamic 属性

他们确实很难正确,大多数情况下,它们都不值得麻烦恕我直言。

注意:我简化了一些事情,并省略了仅在使用objc运行时检查API时可检测到的细节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章