首页投稿(暂停使用,暂停投稿)iOS,object-c和swift开发iOS Developer

第三章 接口与API设计(EffectiveObjective-

2016-06-29  本文已影响90人  谁动了MyWorld

1 使用前缀避免命名空间冲突

2 提供"全能初始化方法"

为对象提供必要信息以便其完成工作的初始化方法叫做"全能初始化方法"
UITableViewCell,在初始化该类对象时,需要指明其样式以及标识符
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
如果创建类实例的方式不止一个,那么这个累就会有很多个初始化方法,不过仍然要在其中选定一个作为全能初始化方法,令其他初始化方法都来调用他
好处:当底层数据存储机制改变时,只需修改此方法的代码就好,无须改变其他初始化方法

3 现实description方法

description:在NSObject协议中,自定义NSLog方法返回的字符串
debugDescription:在NSObject协议中,自定义在控制台通过po命令输出的的字符串

4 尽量使用不可变对象

@interface EOCPointOfInterest : NSObject
@property (nonatomic, copy,readonly) NSString *indentifier;
@property (nonatomic, copy,readonly) NSString *title;
@end
#import "EOCPointOfInterest.h"
@interfaceEOCPointOfInterest ()
@property (nonatomic, copy,readwrite) NSString *indentifier;
@property (nonatomic, copy,readwrite) NSString *title;
@end

@implementation EOCPointOfInterest
@end
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong,readonly) NSSet *friends;
- (void)addFriend:(Person*)person;
- (void)removeFriend:(Person*)person;
@end

@implementation Person{    
  NSMutableSet *_internalFriends;
}

- (NSSet *)friends{    
  return [_internalFriendscopy];
}
- (void)addFriend:(Person *)person{   
    [_internalFriendsaddObject:person];
}
- (void)removeFriend:(Person *)person{ 
   [_internalFriendsremoveObject:person];
}
@end

5 使用清晰而协调的命名方式

方法与变量名使用"驼峰式大小写命名法",变量名小写字母开头,其后每个单词首字母大写
类名首字母要大写,其后每个单词首字母大写.
5.1 方法命名

5.2 类与协议的命名
应该为类与协议的名称加上前缀,以避免命名控件冲突

6 为私有方法名加前缀

@interface EOCObject : NSObject
- (void)publicMethod;
@end
@implementation EOCObject
- (void)publicMethod{}
- (void)p_privateMthod{}
@end

7 理解Objective-C 错误类型

7.1 Objective-C:只在极其严重的错误下抛出异常,抛出异常之后,无需考虑回复问题,而且应用程序此时也应该退出
7.2 在非致命错误:Objective-C所采用的方式是令方法返回nil/0. 或是使用NSError,以表明其中有错误发生
7.3 NSError对象里封装了三条消息

- (BOOL)doSomething:(NSError *__autoreleasing *)error{
  //do somethong that may cause an error   
 if (/*there was an error*/) {
        if (error) {
          *error = [NSErrorerrorWithDomain:domaincode:codeuserInfo:userInfo];
        }        
      returnNO;  
  }   
   returnYES;
}

传递给方法的参数是个指针,而该指针本事又指向另外一个指针,而该指针本身又指向另外一个指针,
那个指针指向NSError对象,或者也可以把他当成一个直接指向NSError对象的指针.这样一来,就可以经由
"输出参数"把NSError对象传递给调用者

NSError *error=nil;
[selfdoSomething:&error];

8 理解NSCoping协议

如果想自己的类支持拷贝操作,那就要实现NSCopying协议,该协议只有一个方法
- (id)copyWithZone:(NSZone *)zone;
long long age,会据此把内存分成不同的"区"(zone),而对象会创建在某个区里面,现在每个程序只有一个去,
"默认区"(default zone).所以在实现这个方法的时候,不用考虑参数zone.

上一篇下一篇

猜你喜欢

热点阅读