Effective Objective-C 2.0 总结与笔记(

2018-11-17  本文已影响0人  JellyP_gdgd

第三章:接口与API设计

​ 在开发应用程序的时候,总是不可避免的会用到他人的代码,或者自己的代码被他人所利用,所以要把代码写的更清晰一点,方便其他开发者能够迅速而方便地将其集成到他们的项目里。

第15条:用前缀避免命名空间冲突

第16条:提供“全能初始化方法”

- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;
- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;

在上面的代码里,initWithTimeIntervalSinceNow就是全能初始化方法,其他所有的初始化方法都要调用它,所以只有该方法才会存储内部数据,当内部数据改变的时候,仅需要改变全能初始化方法即可。

第17条:实现description方法

- (NSString *)description {
    return [NSString stringWithFormat:@"<%@: %p,%@>",
            [self class],
            self,
            @{@"firstName":_firstName,
              @"lastName":_lastName}
            ];
}

第18条:尽量使用不可变对象

//EOCPointInterest.h
@interface EOCPointInterest : NSObject

@property (nonatomic, copy, readonly) NSString *identifier;

@end

//EOCPointInterest.m
#import "EOCPointInterest.h"
@interface EOCPointInterest()

@property (nonatomic, copy, readwrite) NSString *identifier;

@end

@implementation EOCPointInterest
...
@end

//outter
[pointOfInterest setValue:@"GDGD" forKey:@"identifier"];

这样可以直接改动identifier属性,即使没有于公共接口中公布这个方法,它依然可以违规的绕过本类的API。

第19条:使用清晰而协调的命名方式

第20条:为私有方法名加前缀

第21条:理解Objective-C错误模型

id someResource = [someClass new];
if (/* check for error */) {
    @throw [NSEXception exceptionWithName:@"Exception"
            reason:@"ther is a error"
            userInfo:nil];
}
[someResource doSomething];
[someResource release];

如果上述代码发生了异常之后,那么资源就不可能被释放掉了。如果要正确释放应该在抛出异常之前释放掉资源。

第22条:理解NSCopying协议

- (id)copyWithZone:(nullable NSZone *)zone;

NSZone是以前开发程序时,会把内存分成不同的区,而对象会创建在不同的区,现在每个程序只有一个默认区,尽管必须实现这个方法,但是zone参数不用担心。copy方法是由NSObject实现,该方法只是以默认区为参数来调用。

example:

//EOCPerson.h
#import <Foundation/Foundation.h>

@interface EOCPerson : NSObject<NSCopying>

@property(nonatomic, copy) NSString *firstName;
@property(nonatomic, copy) NSString *lastName;

@end
    
//实现NSCopying的方法
- (id)copyWithZone:(NSZone *)zone {
    EOCPerson *copy = [[self class] allocWithZone:zone];
    copy.firstName = _firstName;
    copy.lastName = _lastName;
    return copy;
}
@implementation EOCPerson {
    NSMutableSet *_friends;
}

//如果要访问,那么就是
- (id)copyWithZone:(NSZone *)zone {
    /* copy something*/
    copy->_friends;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone;

对于不可变的NSArray与可变的NSMutableArray来说,下列关系成立:

[NSArray copy] => NSArray;
[NSArray mutableCopy] => NSMutableArray;

[NSMutableArray copy] => NSArray;
[NSMutableArray mutableCopy] => NSMutableArray;
上一篇下一篇

猜你喜欢

热点阅读