需要帮助尝试在Objective-C中使用@property

时间:2014-07-20 22:24:29

标签: objective-c class methods getter-setter

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

2 个答案:

答案 0 :(得分:1)

少数事情:

  1. 在Objective C中,不要为getter使用get前缀。对于布尔属性,您应该使用普通名称或“is”前缀。 (Objective C conventions reference
  2. 你真的不会避免使用getter和setter。 @property符号只是为您定义它们(可能还有一些其他行为,比如复制值而不是分配它)。这只是.符号的问题。在它下面使用getter / setter方法。这里有关于属性(Objetive C properties reference)的更多信息。
  3. 您应将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和脆弱的基类问题有关,这两个问题都不会困扰现代运行时。