objective-c 简要学习笔记

本文深入解析Objective-C中的类声明、属性变量与成员变量的关系、内存管理机制(包括@autoreleasespool与ARC)、KVO机制的实现与应用、对象复制策略(浅拷贝与深拷贝),以及如何在不同场景下正确使用Objective-C的关键概念。
类基础
@interface 类的声明
{//成员数属性,必须是大括号包围起来,默认是是@protected
@private
NSString *_name;
int _age;
@protected
NSString *_nation;
@public
float height;
}

@property(readwrite/readonly,atomicity/nonatomic,assign/retain/copy) type name
//推荐做法是NSString用copy,delegate用assign(暂时不理解),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain
copy:拷贝,复制一个对象并创建strong关联,引用计数为1 ,原来对象计数不变。
assign(默认):赋值,不涉及引用计数的变化,弱引用。ARC中对象不能使用assign,但原始类型(BOOL、int、float)仍然可以使用。
retain:持有,对原对象引用计数加1,强引用。ARC中使用strong。
weak:赋值(ARC),比assign多了一个功能,对象释放后把指针置为nil,避免了野指针。
strong(ARC默认属性):持有(ARC),等同于retain。


@end
关于属性变量与成员变量间的关系:
1:如果只声明一个属性a,不使用@synthesize实现:编译器会使用_a作为属性的成员变量
2:如果声明了一个属性a,使用自定义的Setter或者Getter,编译器使用属性a作为属性的成员变量。
3:如果声明了一个属性a,使用@synthesize a进行实现,但是实现过程中没有指定使用的成员变量:则此时编译器会使用a作为属性的成员变量
4:如果声明了一个属性a,使用@synthesize a=_a进行实现,这个过程已经指定了使用的成员变量:此时会使用指定的成员变量作为属性变量

@implementtation 类的定义
ObjC实例化需要两个步骤:分配内存,初始化 [[ClassName alloc] init] == [ClassName new]

内存管理: @autoreleaespool 与类在初始化时调用autorelease协同作用,在pool程序运行过pool的代码后会自动让发送过autorelease信息的实例,release一次。


objective-c KVO(的键(key)-值(value)观察)
KVO:相当于设计模式的观察者模式
运用接口函数:
两种方式:自动模式与手动模式
默认自动模式:
1:注册与解除注册
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
参数说明:由被观察者(设计模式中的Subject)调用addObserver, 第一个参数是观察者实例(设计模式中的observer) 相当于设计模式中的attach
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; 相当与设计模式中的deattach
2:观察者实现的接口方法:观察多个key时,可以在该函数中判断需要的keyPath,进行特殊处理。
observeValueForKeyPath:(NSString *)keyPath #观察的key
ofObject:(id)object #被观察者的对象
change:(NSDictionary *)change # [[change objectForKey:@"old"] floatValue]
context:(void *)context #自定义内容
值类型:
  NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法
  NSKeyValueObservingOptionOld 把更改之后的值提供给处理方法
行为行:
  NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。
  NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。
可以用或观察多个类型


手动模式:
1:触发事件接口函数
被观察者:
[self willChangeValueForKey:@"age"];
修改key age = theAge;
[self didChangeValueForKey:@"age"];
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key {
if ([key isEqualToString:@"age"]) {
return NO;
}
return [super automaticallyNotifiesObserversForKey:key];
}
首先,需要手动实现属性的 setter 方法,并在设置操作的前后分别调用 willChangeValueForKey: 和 didChangeValueForKey方法,这两个方法用于通知系统该 key 的属性值即将和已经变更了;
其次,要实现类方法 automaticallyNotifiesObserversForKey,并在其中设置对该 key 不自动发送通知(返回 NO 即可)。这里要注意,对其它非手动实现的 key,要转交给 super 来处理。

依赖键:有时候一个属性的值依赖于另一对象中的一个或多个属性,如果这些属性中任一属性的值发生变更,被依赖的属性值也应当为其变更进行标记。
步骤:
1:观察依赖键:observeValueForKeyPath:ofObject:change:context: 中添加处理变更通知的代码
if ([keyPath isEqualToString:@"key"])
2:实现依赖键:keyPathsForValuesAffectingInformation 或 keyPathsForValuesAffectingValueForKey: 方法来告诉系统 information 属性依赖于哪些其他属性,这两个方法都返回一个key-path 的集合。在这里要多说几句,如果选择实现 keyPathsForValuesAffectingValueForKey,要先获取 super 返回的结果 set,然后判断 key 是不是目标 key,如果是就将依赖属性的 key-path 结合追加到 super 返回的结果 set 中,否则直接返回 super的结果。



对象复制
objective-c 对象复制必须实现<NSCopying> <NSMutableCopying>协议,
copy copyWithzZone 拷贝的对象是一个可变时,副本可变
mutableCopy mutableCopyWithZone 无论源对象是否可变,副本是是可变的。
浅拷贝的实现:

-(id)copyWithZone:(NSZone *)zone{

Person *person = [[[self Class]allocWithZone:zone]init];

p.name = _name;

p.age = _age;

return person;

}

深拷贝的实现

-(void)copyWithZone:(NSZone *)zone{

Person *person = [[[self Class]allocWithZone:zone]init];

person.name = [_name copy];

person.age = [_age copy];

return person;

}


源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户与页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()`和`.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值