我对我编写的客观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
这是我的实施档案:
@implementation Animal
- (instancetype)init
{
self = [super init];
if (self) {
self.name = @"No Name";
}
return self;
}
-(instancetype) initWithName:(NSString *) defaultName{
self = [super init];
if (self) {
self.name = defaultName;
}
return self;
}
-(void) getInfo{
NSLog(@"Random Info About Animal");
}
-(float) getWeightInKg:(float)weightInLbs{
return weightInLbs * 0.4545;
}
-(NSString *) talkToMe:(NSString *)myName{
NSString *response = [NSString stringWithFormat: @"Hello my name is %@", myName];
return response;
}
-(int) getSum: (int) num1 nextNumber: (int)num2{
return num1 + num2;
}
@end
这是我的main.m文件:
#import <Foundation/Foundation.h>
#import "Animal.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *dog = [[Animal alloc]init];
[dog setName:@"Bro"];
NSLog(@"The Dog's name is %@", [dog name]);
Animal *newDog = [[Animal alloc]initWithName:@"Spot"];
NSLog(@"The Dog's weight is equal to %.2f", [newDog getWeightInKg:50]);
NSLog(@"5 + 3 = %d", [newDog getSum:5 nextNumber:3]);
NSLog(@"%@", [newDog talkToMe:@"Bob"]);
}
return 0;
}
关于我写的这段代码,我有几个问题:
1)当我定义属性时:
@property NSString *name;
@property NSString *favoriteFood;
@property NSString *sound;
我是否需要在我的实现文件中合成这些属性以接收setter和getter方法?我对此有点困惑,因为在我的main.m文件中,我能够使用setter方法([dog setName:@&#34; Bob&#34;])来获取属性:&#34; @property NSString *名;&#34;即使我没有在我的实现文件中合成该属性。
2)另外,让我说我通过以下方式合成了我的名字属性:
@synthesize name = _name;
_name代表什么?我在网上看到合成这样的属性是常规但是合成的重点是什么,我如何使用&#34; _name&#34;在我的实现或main.m文件中?
3)在&#34 ;-(instancetype)init&#34;的实现文件中方法为什么我们称之为self = [super init]?这&#34; super init&#34;到底是什么?括号中的行返回?
4)同样在我的实现文件中,当我写self.name = @&#34; No Name&#34;时,这个self关键字引用了什么?我在网上看到&#34; self指的是执行当前方法的实际对象。&#34;但我的问题是,当我执行self.name = @&#34; No Name&#34;?
时,我的代码中引用的这个self关键字是什么对象。答案 0 :(得分:3)
我是否需要在我的实现文件中合成这些属性以接收setter和getter方法?
不,只要你不创建自己的getter和setter(或者只读取readonly属性的getter),就会自动创建支持ivars,getter和setter。
_name
代表什么?
这将是支持你的财产的伊娃。如果@synthesize
输出,编译器将自动为您创建一个 - 除非您尝试覆盖两个访问器方法。
为什么我们打电话给
self = [super init]
?
因为如果事先已经初始化了它的超类,那么你的类只能正常工作。 init
按惯例返回对象本身,如果出错则返回nil
。
当我写
self.name = @"No Name"
时,在我的实现文件中,这个self
关键字引用了什么?
self
指的是执行该方法的对象。由于它是一个实例方法,因此它总是在单个对象的上下文中执行,并且该对象是self
。在您的方法中,您希望修改调用该方法的对象,因此您可以访问self.name
。
答案 1 :(得分:1)
您不需要合成,除非您不清楚您将使用标准支持ivar。我的意思是这个,假设我们有一个属性:
@propert (strong, nonatomic, readonly) id someObject;
如果我们要覆盖其吸气剂:
- (id)someObject {
if (!_someObject) {
_someObject = ...;
}
return _someObject;
}
这不起作用。通过覆盖readonly属性的getter,Xcode不确定我们是否真的需要一个支持ivar。我们必须自己合成它。
对于readwrite
属性,同样适用于setter&amp;吸气剂被覆盖了。