设为首页 加入收藏

TOP

Objective-c官方文档 封装数据属性(二)
2014-11-23 21:37:35 来源: 作者: 【 】 浏览:16
Tags:Objective-c 官方 文档 封装 数据 属性
(id)init {
self = [super init];
if (self) {
// initialize instance variables here
}
return self;
}
一个init方法应该分派self和父类初始化方法在做自己的初始化之前。由于父类可能初始化失败或者返回nil因此我们应该检查来确认self不是nil在我们本类初始化时候。
在调用父类初始化方法的时候会层层调用父类的初始化方法,当都初始化完毕的时候那么再初始化自己。
前面我们看的对象初始化除了调用init方法外,或者调用方法初始化特殊值。
- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;
你可以实现这个方法像这样:
- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName {
self = [super init];
if (self) {
_firstName = aFirstName;
_lastName = aLastName;
}
return self;
}
指定初始化是主要的初始化方法:
如果一个对象一个或者多个初始化方法,你应该定义哪个方法是设计的初始化者,这个提供了很多可选的初始化(例如可以有很多的参数),并且可以为其他的方法调用提供便利,你应该也典型重载初始化方法来给你的初始化方法设定默认的值。
如果下面这个方法的类有生日的属性,我们设计初始化方法可能这样:
- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName dateOfBirth:(NSDate *)aDOB;
这个方法将要设置我们的实例变量,如果你将提供便利初始化第一个和第二个名字,你将要这样实现你的初始化方法:
- (id)initWithFirstName:(NSString *) aFrameworkName lastName:(NSString *)aLastName
{
return [self initWithFirstName:aFirstName lastName:aLastName dateOfBirth:nil];
}
你可以实现标准的init方法来提供适当的默认值
- (id)init
{
return [self initWithFirstName:@"qiqi" lastName@"deo" dateOfBirth:nil];
}
你需要写初始化方法当子类用多个初始化方法,你应该重写父类的初始化方法,来实现自己的初始化,或者添加自己的初始化方法,但是都得初始化父类在初始化自己之前。
你可以实现自己的访问器方法:
属性不能一直有自己的辅助实例变量。
举一个例子我们为了跟踪属性的值可以自定义打印出他的值例如:
- (NSString *)fullName {
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
如果你需要写自定义的访问器方法为属性并且有一个实例变量。你必须直接定义实例变量。例如:我们经常在属性里面延迟初始化实例变量懒加载设计模式:
- (XYZObject *)someImportantObject {
if (!_someImportantObject) {
_someImportantObject = [[XYZObject alloc] init];
}
return _someImportantObject;
}
再返回值之前需要检测返回值是不是nil,如果为空那么就初始化对象。
编译器会自动合成一个实例变量在所有的情况下,它也是合成只要一个访问器方法。如果你自己实现访问器和设置器方法,那么编译器会认为你自己控制属性的实现,而不会自动的生成实例变量。
如果你仍然需要实例变量的话,你将要需要请求一个合成。
@synthesize property = _property;
属性默认的是原子性的:
默认的Objective-c属性是原子性的:
@interface XYZObject : NSObject
@property NSObject *implicitAtomicObject; // atomic by default
@property (atomic) NSObject *explicitAtomicObject; // explicitly marked atomic
@end
注意:属性的原子性的特性并不是意味着这个对象的线程是安全的。我们想象一下,一个对象有名字和姓在原子性的访问器被访问。如果一个线程同时访问他们的名和姓,这个原子性的访问方法不一定正确返回值。如果名字在访问之前改变,姓在访问之后改变,你会有一个不一致,不对应的结果,那么这不是你想要的结果。
通过对象的所有权和责任管理对象图
就像你已经看到的,Objective-c的对象是动态创建的在堆上,这意味着你需要用指针来跟踪对象地址,不像常量,不是一直能确定对象的生命周期的范围通过指针变量,相反的是一个对象必须长时间保存在内存中以便于其他的对象引用。
不要试图担心手动管理每个对象的生命周期,你应该试图考虑对象之间的关系。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言结构、联合、位操作、位域和.. 下一篇pinyin.c与Unicode汉字编码表 对..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: