码迷,mamicode.com
首页 > 其他好文 > 详细

OC学习总结5 属性,初始化,类别,协议

时间:2015-08-02 13:18:29      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

属性的实现

成员变量只能在类内部使用,属性是可以被外界访问的。

1.属性的声明

#import <Foundation/Foundation.h>

@interface QYPerson : NSObject

{
    NSString *_name;
}

//@property是编译指令,帮助直接生成setter和getter方法,以及成员变量
@property (readonly, nonatomic) NSString *identify;
@property (nonatomic) NSString *name;
@property (nonatomic) int age;
@property (nonatomic, getter=isMan) BOOL sex; // getter=isMan用来更改getter方法的名字,特别对于布尔值的一些属性这样改名字会有利用getter方法语义的理解,尽量不要该setter方法的名字

// @property (nonatomic)int age;
// 中间的(nonatomic)是属性扩展,分为三类
// 内存相关的:strong assign copy weak retain
// 读写相关的:readonly readwrite(默认值)
// 性能相关的:nonaotmic aotmic


@end

  @dynamic

告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告

然后由自己实现存取方法

  @synthesize name = nickName;

@synthesize 在4.2之前版本需要配合生成成员变量名字使用及生成setter getter方法,在4.2之后只是用来给成员变量起别名

 2 属性的扩展

a  读写 默认的是readwrite

b  只读 readonly

c  内存管理(默认assign,相当于之前的__unsafe_unretained)

d  assign/weak弱引用/strong(retain)(强引用)/copy

   对于copy限定的自定义类,是指需要在给该属性赋值的时候用copy来完成,但是这取决于程序员的逻辑

e  原子性(默认nonatomic,可以提高程序性能)      nonatmic/aotmic

@private 修饰的成员变量只有本类可见

@protected 修饰的成员变量只有本类和子类中可见

@public修饰成员变量在所有地方都可见

3 初始化

用new新建对象的时候,默认调用的是alloc分配内存,然后再调用init方法初始化

便利初始化:指的是在初始化的时候可以很方便的进行赋值

指定初始化:在编写便利初始化的时候,通过self调用其他属性已编辑好的便利初始化方法并附上初始化的值,即指定初始化值的初始化方法

编写初始化方法的时候一定要记得[super init],用来初始化自超类继承过来的属性变量

类别 Category

类别与继承的区别

类别是对类本身方法方法的扩展

继承是建立一个新的类用来扩展新的属性和方法

类别的优点

  将类的实现代码分散到多个不同文件或框架中

  拆分头文件

  添加非正式协议,非正式协议是指对NSObject的扩展出的类别,所有对象都可以使用非正式协议中声明实现的方法,声明如下

#import <Foundation/Foundation.h>

@interface NSObject (BlackRule)

- (void)laugh;

@end

 

 

  实现如下

#import "NSObject+BlackRule.h"

@implementation NSObject (BlackRule)

- (void)laugh
{
    NSLog(@"??,你被潜规则了");
}

@end

 

  类别的优先级最高,会掩盖掉原来类中的同名方法,会有警告

类别的声明

  使用公共的头文件(可以把类别的声明全部放入发到类的借口文件)

#import <Foundation/Foundation.h>

@interface TestClass : NSObject

@property (nonatomic, strong) NSString *name;

- (void)doTthing;

@end

// 利用类别来拆分类的实现
@interface TestClass (TestCategory1)

- (void)doTthing1;

@end

@interface TestClass (TestCategory2)

- (void)doTthing2;

@end

@interface TestClass (TestCategory3)

- (void)doTthing3;

@end

 

  使用分离的头文件(可以按类名+类别名的文件命名方式来单独存放类别的声明),新建category文件来声明实现类别

响应选择器 @selector

@selector (方法名)

SEL 可以理解为方法的类型

SEL method = @select(方法名),可以用method作为变量,当做参数使用

        //@selector(destoriedLife)代表
        SEL method = @selector(destoriedLife);
        BOOL result = [ps respondsToSelector:method];
        if ([ps respondsToSelector:method]) {
            NSLog(@"执行destoriedLife");
        } else {
            NSLog(@"不能执行destoriedLife");
        }

 

- (BOOL)respondsToSelector:(SEL)aSelector;用来检测对象是否能响应某个方法

协议 @protocol

协议是建立在两方之上,使用协议之后,必须承诺实现协议声明的所有方法。协议本事是一个有文件,过多的导入头文件会引起编译问题,需要注意协议的使用时机

#import <Foundation/Foundation.h>

@protocol SecretProtocol <NSObject>

+ (void)foo;

- (void)phoneCall;
- (void)teakTea;

@optional //@optional用来修饰协议里面的方法是否可选
- (void)goShopping;


@required //@optional用来修饰协议里面的方法是必须实现的
- (void)meetting;
- (void)takeDinner;

@end

 

使用协议

#import <Foundation/Foundation.h>
#import "SecretProtocol.h"

@interface Secrectary : NSObject <SecretProtocol>

@end

 NSCopying协议

copy:默认调用copyWithZone,copyWithZone:才是NSCopying协议中规定必须实现的

OC学习总结5 属性,初始化,类别,协议

标签:

原文地址:http://www.cnblogs.com/k-on/p/4695465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!