当前位置:K88软件开发文章中心编程语言Objective-CObjective-C01 → 文章内容

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-10 11:12:17


NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setDateFormat:@"yyyy-MM-dd'
T'
HH:mm:ss.SSSSS"];
{
return _dateFormatter;
{
即使在一些情况下这是有益的,
但是我们仍然建议你在决定这样做之前经过深思熟虑,
事实上这样是可以避免的。
下面是使用 延迟实例化的争议。
getter 方法不应该有副作用。
在使用 getter 方法的时候你不要想着它可能会创建一个对象或者导致副作用,
事实上,
如果调用 getter 方法的时候没有涉及返回的对象,
编译器就会放出警告:getter 不应该产生副作用你在第一次访问的时候改变了初始化的消耗,
产生了副作用,
这回让优化性能变得困难(以及测试)这个初始化可能是不确定的:比如你期望属性第一次被一个方法访问,
但是你改变了类的实现,
访问器在你预期之前就得到了调用,
这样可以导致问题,
特别是初始化逻辑可能依赖于类的其他不同状态的时候。
总的来说最好明确依赖关系。
这个行为不是 KVO 友好的。
如果 getter 改变了引用,
他应该通过一个 KVO 通知来通知改变。
当访问 getter 的时候收到一个改变的通知很奇怪。
方法参数断言你的方法可能要求一些参数来满足特定的条件(比如不能为nil),
在这种情况下啊最好使用 NSParameterAssert() 来断言条件是否成立或是抛出一个异常。
私有方法永远不要在你的私有方法前加上 _ 前缀。
这个前缀是 Apple 保留的。
不要冒重载苹果的私有方法的险。
相等性当你要实现相等性的时候记住这个约定:你需要同时实现isEqual and the hash方法。
如果两个对象是被isEqual认为相等的,
它们的 hash 方法需要返回一样的值。
但是如果 hash 返回一样的值,
并不能确保他们相等。
这个约定是因为当被存储在集合(如 NSDictionary 和 NSSet 在底层使用 hash 表数据的数据结构)的时候,
如何查找这些对象。
@implementation ZOCPerson- (BOOL)isEqual:(id)object { if (self == object) { return YES;
{
if (![object isKindOfClass:[ZOCPerson class]]) { return NO;
{
// check objects properties (name and birthday) for equality ... return propertiesMatch;
{
- (NSUInteger)hash { return [self.name hash] ^ [self.birthday hash];
{
@end一定要注意 hash 方法不能返回一个常量。
这是一个典型的错误并且会导致严重的问题,
因为使用了这个值作为 hash 表的 key,
会导致 hash 表 100%的碰撞你总是应该用 isEqualTo<
#class-name-without-prefix#>
: 这样的格式实现一个相等性检查方法。
如果你这样做,
会优先调用这个方法来避免上面的类型检查。
一个完整的 isEqual* 方法应该是这样的:- (BOOL)isEqual:(id)object { if (self == object) { return YES;
{
if (![object isKindOfClass:[ZOCPerson class]]) { return NO;
{
return [self isEqualToPerson:(ZOCPerson *)object];
{
- (BOOL)isEqualToPerson:(Person *)person { if (!person) { return NO;
{
BOOL namesMatch = (!self.name &
&
!person.name) || [self.name isEqualToString:person.name];
BOOL birthdaysMatch = (!self.birthday &
&
!person.birthday) || [self.birthday isEqualToDate:person.birthday];
return haveEqualNames &
&
haveEqualBirthdays;
{
一个对象实例的 hash 计算结果应该是确定的。
当它被加入到一个容器对象(比如 NSArray, NSSet, 或者 NSDictionary)的时候这是很重要的,
否则行为会无法预测(所有的容器对象使用对象的 hash 来查找或者实施特别的行为,
如确定唯一性)这也就是说,
应该用不可变的属性来计算 hash 值,
或者,
最好保证对象是不可变的。

上一页  [1] [2] [3] [4] [5]