Objective-c中的"实例变量"和"属性"之间有区别吗?
我对此不太确定.我认为"属性"是一个具有存取方法的实例变量,但我可能认为错了.
Chu*_*uck 82
财产是一个更抽象的概念.实例变量实际上只是一个存储槽,就像结构中的槽.通常,其他对象永远不应该直接访问它们.另一方面,属性是您可以访问的对象的属性(听起来很模糊,应该是这样).通常,属性将返回或设置实例变量,但它可以使用多个数据或根本不使用数据.例如:
@interface Person : NSObject {
NSString *name;
}
@property(copy) NSString *name;
@property(copy) NSString *firstName;
@property(copy) NSString *lastName;
@end
@implementation Person
@synthesize name;
- (NSString *)firstName {
[[name componentsSeparatedByString:@" "] objectAtIndex:0];
}
- (NSString *)lastName {
[[name componentsSeparatedByString:@" "] lastObject];
}
- (NSString *)setFirstName:(NSString *)newName {
NSArray *nameArray = [name componentsSeparatedByString:@" "];
NSArray *newNameArray [[NSArray arrayWithObjects:newName, nil] arrayByAddingObjectsFromArray:[nameArray subarrayWithRange:NSMakeRange(1, [nameArray size]-1)]];
self.name = [newNameArray componentsJoinedByString:@" "];
}
- (NSString *)setLastName:(NSString *)newName {
NSArray *nameArray = [name componentsSeparatedByString:@" "];
NSArray *newNameArray [[nameArray subarrayWithRange:NSMakeRange(0, [nameArray size]-2)] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:newName, nil]];
self.name = [newNameArray componentsJoinedByString:@" "];
}
@end
Run Code Online (Sandbox Code Playgroud)
(注意:上面的代码是错误的,因为它假设名称已经存在且至少有两个组件(例如"比尔盖茨"而不仅仅是"盖茨").我觉得修复这些假设会使代码的实际点不太清楚,所以我只是在这里指出,所以没有人无辜地重复那些错误.)
Mik*_*ler 32
属性是一种为某些值实现getter/setter的友好方式,具有其他有用的功能和语法.属性可以由实例变量支持,但是您也可以定义getter/setter以执行更动态的操作,例如,您可以在字符串上定义lowerCase属性,该属性动态创建结果而不是返回某个成员的值变量.
这是一个例子:
// === In your .h ===
@interface MyObject {
NSString *propertyName;
}
// ...
@property (nonatomic, retain) NSString *propertyName;
// === In your .m @implementation ===
@synthesize propertyName /* = otherVarName */;
Run Code Online (Sandbox Code Playgroud)
该@property行定义了一个名为propertyNametype 的属性NSString *.可以使用以下语法获取/设置:
myObject.propertyName = @"Hello World!";
NSLog("Value: %@", myObject.propertyName);
Run Code Online (Sandbox Code Playgroud)
当您分配或读取时,myObject.propertyName实际上是在对象上调用setter/getter方法.
该@synthesize行告诉编译器为您生成这些getter/setter,使用具有相同属性名称的成员变量来存储值(或者otherVarName如果您在注释中使用语法).
随着@synthesize你仍然可以定义自己的重载的getter/setter方法之一.这些方法的命名约定是setPropertyName:针对getter的setter和propertyName(或getPropertyName非标准).另一个仍将为您生成.
在您的@property行中,您可以在属性的parens中定义许多属性,这些属性可以自动执行线程安全和内存管理等操作.默认情况下,属性是原子的,这意味着编译器将@synthesiz使用适当的锁包装ed get/set调用以防止并发问题.您可以指定nonatomic要禁用此属性的属性(例如,在要将大多数属性设置为默认的iPhone上nonatomic).
有3个属性值可以控制任何@synthesizedsetter的内存管理.第一个是retain自动发送release到属性的旧值和retain新值.这非常有用.
第二个是copy复制传入的任何值,而不是保留它们.最好使用copyNSString,因为调用者可以传入NSMutableString并将其从您下面更改.copy将创建只有您有权访问的输入的新副本.
第三种是assign直接指针分配而不调用旧对象或新对象上的保留/释放.
最后,您还可以使用该readonly属性禁用属性的setter.
| 归档时间: |
|
| 查看次数: |
27908 次 |
| 最近记录: |