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

属性的实现

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

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协议中规定必须实现的

时间: 2025-01-09 09:04:09

OC学习总结5 属性,初始化,类别,协议的相关文章

iOS设计之--OC学习总结之延展类目协议

类目:为已知的类增加新的方法:延展:通知在本类的定义里使用类目来声明私有方法:协议:协议声明了可以被任何类实现的方法.注意:这些手段只能增加类的方法,并不能用于增加实例变量,要增加类的实例变量,只能通过定义子类来间接实现.1.类目1)声明类目@interface NSString (NumberConvenience)-(NSNumber *)lengthAsNumber;@end该声明具有2个特点.首先,现有类位于@interface关键字之后,其后是位于圆括号中的一个新名称.该声明表示,类别

OC学习笔记之属性详解和易错点

属性的概念在OC1.0中就存在,格式是定义实例变量,然后定义setter和getter方法,用点操作符操作属性 举例,类的接口部分 1 @interface Father : NSObject 2 { 3 NSInteger _item; 4 } 5 #pragma mark - 属性 6 -(void)setItem:(NSInteger)item; 7 -(NSInteger)item; 8 9 -(void)setAAA:(NSInteger)aaa; 10 -(NSInteger)AAA

MongoDB学习笔记~数据模型属性为集合时应该为它初始化

回到目录 今天要说一下技术点,我们在设计mongodb的数据模型时,如果属性是数组或者集合类型,我们在模型初始化时,需要为它们初始化一下,否则在数据库里将会被存储为NULL,当被存储为NULL时,我们将无法进行组件的push,pull等操作. 之间在设计模型时没有注意这点,然后产生的问题就是,没有被集合赋值,在mongodb里将会存储为NULL 而在对数组元素进行push时,当然就出现了下面的异常,因为mongodb不知道它是一个数组对象,呵呵 当我们为模块的集合属性初始化这后,存储的数据结构就

JAVA基础学习-属性初始化

对象属性初始化有3种1. 声明该属性的时候初始化2. 构造方法中初始化3. 初始化块 类属性初始化有2种1. 声明该属性的时候初始化2. 静态初始化块 对象属性的初始化有三种方式的优先级 当对一个对象实例化时,首先会加载实例变量,然后再执行初始化代码块,最后执行构造方法. 对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句:(2)当static语句执行完之后,再执行main方法:(3)如果有语句new了自身的对象,将从上到下执行构造代码块.构造器(两者可以

oc学习笔记-语法学习总结

1.定义类:@interface 类名 : 父类@end 2.使用:(冒号)表示继承一个类Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原有类结构的基础上,扩展原有类的方法(不能扩展属性),但不建议重载原有类的方法 * 开发工具默认生成的文件为:类名+Catagory名称 * Catagory可以写在单独的文件中,也可以写在原有类的文件中,如何写根据需求来决定. 4.使用<>表示实现一个Protocol(协议),如需实现多个协议,将协议名

OC学习16——对象归档

转载自  OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都是需要实现一个接口:Serializable,同样的OC中操作的对象也是需要实现一个协议的,后面会说到. 一.已有类型的归档和解档 首先来看一个简单的例子: 1 // 2 // main.m 3 // 33_ObjectToFile 4 // 5 // Created by jiangwei on

OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,

OC学习总结之面向对象和类

OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程  面向对象和面向过程是编程的两种思考方式.面向对象,简称OOP,它是以事物为中心,参与事件的事物是核心,完成事件只是事物的一个小任务.面向过程,简称OPP,它是以事件为中心,事件是核心,列出了完成事件的每一个步骤,一步一步完成.也就是面向对象侧重于从问题在寻找客体.客体的作用.客体间的关系即“谁”.“做什么”.“怎么做”,面向过程侧重于问题的分解即“事

OC基础之-Property(属性)和点语法

学习属性之前回忆一下之前学到的setter方法和getter方法: (1)setter方法的作用:用来为单一的实例变量赋值(只能是一个实例变量,多了的叫做get方法) (2)setter方法的写法标准: - 号方法,  无返回值,   名字以set开头+要设置的变量的实例变量名(首字母需大写):(setter方法有且只有一个参数)+参数的类型(和实例变量的类型相同)+参数名(和实例变量名相同) (3)getter方法的作用:用来获取单一实例变量的值. (4)getter方法的写法标准: - 号方