obc学习笔记4

本文详细介绍了Objective-C中的对象初始化过程,强调了指定初始化函数的使用。此外,还讨论了属性的访问权限,点表达式的getter和setter行为。类别(category)的概念被提出,包括其优点(如分散代码、创建前向引用)和缺点(无法添加实例变量,可能引起名称冲突)。同时,协议在Objective-C中的角色也得到阐述。最后,简要介绍了代码块(闭包)的相关特性,如变量绑定和返回类型推导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象初始化:

[[类名 alloc] init]//嵌套调用优
[类名 new]

(id) init{
    if(self=[super init]){//如果从super的init返回了新对象,就需要更新self
    //do
    }
    return self;
}//init

初始化函数:
一定要在指定初始化函数中调用超类的指定初始化函数。如果初始化函数不止一个,则需要选择一个作为指定初始化函数(参数最多的初始化函数优),其他初始化函数则应该调用指定初始化函数。

属性:

@property(copy)NSString * name//声明访问方法
            //assign:默认选项,基础数据类型 (NSInteger)和C数据类型
            //copy:NSString,copy字符串后需要在dealloc中release
            //retain:其他NSObject及其子类
            //readwrite:默认选项,可读可写
            //readonly:只读
            //getter= 或setter= 自定义方法名
@synthesize name=appellation//创建访问方法,如果没有指定实例变量则创建appellation
@dynamic//不自动创建变量或访问方法,当不想存储某个属性,并且在运行时计算时使用,需要自己实现访问方法

.h中声明的属性和成员变量均可以在子类中访问到,类似protected,而.m则不可,类似private

点表达式:
对象.实例变量 当点表达式在等号左边,调用setter,反之则调用getter

self.name=@"Car";
[self setName:@"Car"];

类别category:

为现有的类增加新的方法
命名风格:“类名称+类别名称”

缺点:
1.不能添加实例变量,只能添加属性,且必须是@dynamic(方便使用点表达式);
2.名称冲突,类别优先。

优点:
1.分散代码到不同文件或框架;
2.创建对私有方法的前向引用:新建类别,在类别文件中声明原始类的该方法,就能调用该私有方法;
3.向对象添加非正式协议:任何类只要实现委托方法就可以成为委托对象。

协议:

@protocal 协议名<父协议名>//声明协议
@optional//可选是否实现
@required//必须实现
@end

@interface 类名:父类名 <协议名1,协议名2>//采用协议
@end

代码块(闭包):

变量绑定分为自动绑定:栈内存和托管绑定:堆内存

返回类型可以手动声明也可以由编译器推导
具有指定类型的参数列表
拥有名称

int (^square_block)(int number) =  ^(int number) {return (number * number);};
//返回类型 (^代码块名) (参数列表)=^(参数列表){  };
//返回类型可以省略,如果代码块没有参数,参数列表也可以省略
int result = square_block(5);


NSArray *sortedArray = [array sortedArrayUsingComparator:^(NSString *object1, NSString *object2) {return [object1 compare:object2];}];//直接使用代码块


typedef double (^MKSampleMultiplyBlockRef)(void);

double a = 10, b = 20;
MKSampleMultiplyBlockRef multiply = ^(void){ return a * b; };//代码块会在定义时复制并保存状态,将本地变量视作常量,return 200;
NSLog(@"%f", multiply());//200
a = 20;
b = 50;
NSLog(@"%f", multiply());//200,如果a和b为static,则返回1000


__block double c = 3;
MKSampleMultiplyBlockRef multiply = ^(double a, double b) { c = a * b; };//代码块将本地变量视作常量,而__block表明c是可修改的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值