【发布时间】: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