大家好,如果您还对深入解析iOS开发:Objective-C技术详解不太了解,没有关系,今天就由本站为大家分享深入解析iOS开发:Objective-C技术详解的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
一个。在ARC中,当可能出现循环引用时,往往通过让一端使用weak来解决,比如:delegate代理属性
b.它已经对此做出了强有力的参考。没有必要再次进行强引用。这时候也会用到weak。定制的IBOutlet控件属性一般使用weak;当然也可以用strong。下面也讨论了:
差异:
弱属性指示该属性定义“非拥有关系”。当为此类属性设置新值时,setter 方法既不保留新值,也不释放旧值。这个trait与assign类似,但是当属性指向的对象被销毁时,属性值也会被清除(nilout)。 allocate的“设置方法”只会对“标量类型”(如CGFloat或NSInteger等)进行简单的赋值操作。 assigin可以用于非OC对象,但对于OC对象必须使用weak
3. 如何使用copy关键字?
copy 这个特质所表达的所有权类似于强。然而,set方法并不保留新值,而是“复制”它。当属性类型为NSString 时,此特性通常用于保护封装,因为传递给setter 方法的新值可能指向NSMutableString 类的实例。该类是NSString 的子类,它表示一个可以修改其值的字符串。如果此时没有复制字符串,那么在设置属性之后,字符串的值可能会在对象不知情的情况下被更改。因此,这时候就需要复制一份“不可变”的副本。
(不可变)字符串,以确保对象中的字符串值不会无意中更改。只要用于实现属性的对象是“可变的”,在设置新的属性值时就应该创建一个副本。
使用@property来声明NSString、NSArray和NSDictionary。 copy 关键字经常被使用,因为它们有相应的变量类型:NSMutableString、NSMutableArray 和NSMutableDictionary。它们之间可能存在赋值操作。为了确保对象中的字符串值不会意外地发生变化,在设置新的属性值时应该进行复制。
4、这种写法会出现什么问题: @property (copy) NSMutableArray *array;
两个问题:
1.当对数组中的元素进行添加、删除、修改时,程序会因为找不到对应的方法而崩溃。因为copy是复制一个不可变的NSArray对象;
2、使用原子属性会严重影响性能;
5. 如何在自己的类上使用复制修饰符?如何使用复制关键字覆盖setter?
如果你想让你写的对象具有复制功能,你需要实现NSCopying 协议。如果自定义对象分为可变版本和不可变版本,那么必须同时实现NSCopying 和NSMutableCopying 协议。
具体步骤:
1.需要声明该类遵守NSCopying协议
2. 实现NSCopying 协议。该协议只有一种方法:
6.@property的本质是什么? ivar、getter 和setter 如何生成并添加到此类中
1.@property的本质是什么?
@property的本质=ivar(实例变量) + getter(检索方法) + setter(存储方法)
“属性”有两大概念:实例变量(ivar)和访问方法(getter + setter)
2. ivar、getter、setter是如何生成并添加到这个类中的?
这是由编译器自动合成的,并由@synthesize关键字指定。如果不指定,默认为@synthesize propertyName=_propertyName;如果手动实现getter/setter方法,则不会自动合成。现在编译器已经默认为我们添加了@synthesize propertyName=_propertyName;所以除非你确实想更改成员变量名称,否则不需要手动添加它。
生成getter方法时,会判断当前属性名是否带“_”,例如属性声明为@property(nonatomic,copy) NSString*_name;那么生成的成员变量名就会变成“_name”。如果我们想要手动生成一个getter方法,就必须判断它是否以“_”开头。
7. 如何在@protocol和category中使用@property
在协议@protocol中使用@property只会生成setter和getter方法声明。使用属性的目的是希望符合我们协议的对象能够实现属性;
在类别中使用@property只会生成setter和getter方法声明。如果确实需要向类别添加属性,则需要使用两个运行时函数。
//objc_setAssociatedObject
//objc_getAssociatedObject
8. Runtime如何实现弱属性?
要实现weak属性,首先要了解weak属性的特点:
弱属性表明该属性定义了“非拥有关系”。当为此类属性设置新值时,setter 方法既不保留新值,也不释放旧值。这个trait与assign类似,但是当属性指向的对象被销毁时,属性值也会被清除(nil out)。
那么运行时是如何实现弱变量自动设置nil的呢?
运行时将布局注册的类并将弱对象放入哈希表中。使用weak指向的对象的内存地址作为key。当该对象的引用计数为0时,就会执行dealloc。如果weak指向的对象的内存地址是a,那么a将被用作key。在这个weak表中搜索,找到所有以a为key的weak对象,从而设置为nil。
[]@property中的属性关键字是什么?
[]dealloc时weak属性需要设置为nil吗?
在ARC环境下,无论是强指针还是弱指针,都不需要在dealloc中将其设置为nil。 ARC会自动为我们处理。
即使编译器不为我们执行此操作,weak 也不需要在dealloc 中设置nil。
[]@synthesize和@dynamic的作用是什么?
Synthesis,当你不手动实现这两个方法时,编译器会自动生成setter和getter方法。
dynamic,告诉编译器你将动态生成setter和getter方法,并且你不会要求编译器为你生成它们。
@synthesize日期=_date;这一直是令人困惑的。这是将成员变量绑定到您的属性。
现在不需要写synthesize了。
[] ARC下,当没有显式指定属性关键字时,默认的关键字是什么?
基本数据类型对应的默认关键字为
原子、读写、分配
对于普通OC对象
原子、读写、强
[] 用@property声明的NSString(或NSArray、NSDictionary)经常使用copy关键字,为什么?如果使用strong关键字会导致什么问题?
因为父类指针可以指向子类对象,所以使用copy的目的就是为了防止这个对象的属性受到外界的影响。使用副本
无论传递给我的是可变对象还是不可对象对象,我持有的都是不可变的副本。
如果我们使用的是强
,那么这个属性可能指向一个可变对象。如果外部修改了可变对象,就会影响属性。
copy 该特质所表达的所有权关系与strong相同
相似的。然而,set方法并不保留新值,而是“复制”它。当属性类型为NSString 时
当传递给setter 方法的新值可能指向NSMutableString 类的实例时,此特征通常用于保护封装。这个类是NSString
的子类表示一个可以修改其值的字符串。如果此时没有复制字符串,那么在设置属性之后,字符串的值可能会在对象不知情的情况下被更改。因此,这时候就需要复制一份“不可变”的副本。
(不可变)字符串,以确保对象中的字符串值不会无意中更改。只要用于实现属性的对象是“可变的”,在设置新的属性值时就应该创建一个副本。
[]@synthesize 合成实例变量的规则是什么?如果属性名为foo并且有一个名为_foo的实例变量,是否会自动合成一个新变量?
[]有了属性实例变量的自动合成,@synthesize还有哪些使用场景?
[]向objc中的nil对象发送消息会发生什么?
[]向objc中的对象发送消息[obj
foo] 和objc_msgSend() 函数?
[]什么时候会报无法识别的选择器异常?
[]如何布局objc对象的内存? (考虑有父类的情况)
【深入解析iOS开发:Objective-C技术详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
学习 iOS 开发就必须要了解 Objective-C 啊!
有18位网友表示赞同!
Objective-C 在 iOS 历史上占了很大的地位呢。
有6位网友表示赞同!
现在流行 Swift 了,但 Objective-C 还是有很多人在用的。
有11位网友表示赞同!
想看 iOS 源码,Objective-C 是必备的工具。
有10位网友表示赞同!
Objc 的语法确实有点复杂,不过经过一段时间的学习就能懂了。
有11位网友表示赞同!
Objective-C 开发的速度其实挺快的,尤其是对于熟悉 C++ 的人来说。
有7位网友表示赞同!
现在很多 iOS 学习资料都包含了 Objective-C 的内容...
有16位网友表示赞同!
Objective-C 有一定的历史包袱,有些部分我觉得不太好用...
有13位网友表示赞同!
老项目都是用 Objective-C 写的,维护起来还好。
有13位网友表示赞同!
虽然 Swift 很好用,但还是有点怀念 Objective-C 的感觉...
有16位网友表示赞同!
Objective-C 和 Swift 可以完美融合呢!很多复杂的 iOS 项目都采用了两者!
有18位网友表示赞同!
想深入了解 iOS 的底层机制,Objective-C 是要学的一部分
有20位网友表示赞同!
Objective-C 做游戏也是很好的选择啊!
有14位网友表示赞同!
其实 Objective-C 本身很强大,只是语法比较传统了。
有12位网友表示赞同!
有很多 Objective-C 库可以提升开发效率!
有6位网友表示赞同!
Objective-C 的社区也挺活跃的,很多问题都能找到解答。
有7位网友表示赞同!
iOS 开发真好玩!学习 Objective-C 让我对手机开发有更深刻的理解...
有17位网友表示赞同!
最近在看一些关于 Objective-C 的书籍,感觉很有收获!
有14位网友表示赞同!
Objective-C 给我的编程思维带来了很大的提升!
有19位网友表示赞同!