【问题标题】:Property Setter and Getter Not able to overwrite [duplicate]属性设置器和获取器无法覆盖[重复]
【发布时间】:2015-10-12 17:45:28
【问题描述】:

所以我有一个 Animal 类的 Objective-C 头文件:

#import <Foundation/Foundation.h>

@interface Animal : NSObject

@property NSString *name;
@property NSString *favoriteFood;
@property NSString *sound;

@property float weight;

-(instancetype) initWithName:(NSString *) defaultName;

-(void) getInfo;

-(float) getWeightInKg: (float) weightInLbs;

-(NSString *) talkToMe: (NSString *) myName;

-(int) getSum: (int) num1
   nextNumber: (int) num2;

@end

由于某种原因,当我尝试在 Animal 类的实现文件中覆盖 @property NSString *name 的 setter 或 getter 方法时,我无法这样做,它给了我一个警告,说“可写原子属性'name' 不能将合成的 getter 与用户定义的 setter 配对”。我在这里做错了吗?因为我认为@property 会自动创建一个 ivar 以及 setter 和 getter 方法,您可以在实现文件中覆盖这些方法。有人可以帮我解决这个问题。非常感谢您提前提供的帮助!

【问题讨论】:

  • 尝试将定义更改为@property (readonly) NSString *name;。这样编译器就不会生成setter,让你自己实现。
  • 好的,但是如果我不向属性添加任何属性(例如强、非原子等)怎么办。如果没有这些属性,我就不能创建自己的 setter 和 getter 方法吗?
  • 默认是readwrite,这意味着编译器会为你创建(也就是合成)一个。 strong 和 nonatomic 定义了这些合成方法如何处理内部变量。 readwrite 是默认值,因此会与您的自定义设置器发生冲突。
  • 如果你有一个原子属性,你不能只覆盖 setter 或 getter 中的一个,你需要同时覆盖它们或者都不覆盖。

标签: ios objective-c


【解决方案1】:

将您的属性定义为:

@property (nonatomic) NSString *name;
@property (nonatomic) NSString *favoriteFood;
@property (nonatomic) NSString *sound;

【讨论】:

  • 所以如果我把它作为非原子的并且我只覆盖我的setter方法,我的getter方法仍然会自动创建还是它甚至不存在并且我必须自己实现它?我现在的理解是,如果我的属性的属性是原子的,那么我必须同时覆盖 setter 和 getter 方法,但如果它是非原子的,如果我不覆盖两者,因为它们无论如何都会自动创建?
  • 如果您将属性定义为“原子”(默认设置),那么您必须同时提供 setter 和 getter,或者让编译器为您生成它们。如果您将其设置为“非原子”,那么您可以实现 setter 或 getter,或两者兼而有之,编译器将为您生成缺少的 setter 或 getter。
  • 你可能会发现这篇文章也很有用:bignerdranch.com/blog/property-values
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2014-07-24
  • 2017-08-29
  • 2015-11-01
相关资源
最近更新 更多