Objective-C的新手(以及针对该问题的编程),如果这个问题非常基础,请不要太苛刻。
除了我的 main.m 课程外,我还有一个 Student.h 和 Student.m 课程。我试图避免在未来的项目中使用许多getter和setter,如果我没错, @property 可以帮助我。我的基本代码是:
Student.h:
#import <Foundation/Foundation.h>
@interface Student : NSObject{
NSString *name;
int age;
}
//setters
- (void)setName:(NSString*)fName;
- (void)setAge:(int)newAge;
//getters
- (NSString*)getName;
- (int)getAge;
@end
Student.m:
#import "Student.h"
@implementation Student
- (void)setName:(NSString*)fName {
name = fName;
}
- (void)setAge:(int)newAge {
age = newAge;
}
- (NSString*)getName {
return name;
}
- (int)getAge {
return age;
}
@end
我可以使用@property来做这样的事情,这会避免使用getter和setter方法吗?或者我明白这一切都错了吗?
#import <Foundation/Foundation.h>
@interface Student : NSObject{
}
@property int age;
@property NSString *name;
@end
答案 0 :(得分:1)
少数事情:
@property
符号只是为您定义它们(可能还有一些其他行为,比如复制值而不是分配它)。这只是.
符号的问题。在它下面使用getter / setter方法。这里有关于属性(Objetive C properties reference)的更多信息。NSString
属性定义为(copy)
。如果你在其他地方改变它会更好地影响这个对象(并且你可能想要避免这种情况),这要好得多。答案 1 :(得分:0)
你是不是来自Java?
是的,Objective-C过去常常需要手工编写getter和setter。现在,如果您使用@property
并且不想做任何其他事情,那么将为您生成合适的实例变量和适当的getter和setter。
所以以下是一个具有可用属性的完整类,可以通过传统的setName:
/ name
样式的setter和getter访问,也可以通过点符号(尽管看起来像是一个调用setter和getter)来访问C struct access:
@interface Student : NSObject
@property int age;
@property NSString *name;
@end
/* ... */
@implementation Student
@end
同样作为一般的封装/数据隐藏注释,请注意Objective-C早已被修改,以便可以在[未发布] @implementation
而不是[已发布] {{1}中声明实例变量}}。在技术层面上,它完全与ABI和脆弱的基类问题有关,这两个问题都不会困扰现代运行时。