Skip to content

Commit 3c09d0d

Browse files
committed
类对象内存地址说明
1 parent aaf94be commit 3c09d0d

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

01《招聘一个靠谱的iOS》面试题参考答案/Demo_38_block_edit_var/Demo_38_block_edit_var/AppDelegate.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,29 @@
99
#import "AppDelegate.h"
1010

1111
@interface AppDelegate ()
12+
@property (nonatomic, strong) NSString *nso;
13+
1214

1315
@end
1416

1517
@implementation AppDelegate
1618

19+
int age1 = 20;
1720

1821
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
1922
// Override point for customization after application launch.
23+
int a = 10;
24+
NSLog(@"数据段:age %p", &age1);
25+
NSLog(@"栈: a %p", &a);
26+
NSLog(@"堆:obj %p", [[NSObject alloc] init]);
27+
NSLog(@"class:obj %p", NSClassFromString(@"NSObject"));
28+
NSLog(@"class %p", [NSObject class]);
29+
// for (int i = 0; i < 100000; ++i) {
30+
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
31+
// id o =[NSString stringWithFormat:@"%@%@", @"iTeaTime(技术清谈)", @(i)];
32+
// self.nso = o;
33+
// });
34+
// }
2035
return YES;
2136
}
2237

01《招聘一个靠谱的iOS》面试题参考答案/《招聘一个靠谱的iOS》面试题参考答案(上).md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,7 @@ NSObject *foo = [[NSObject alloc] init];
11561156
11571157
11581158
注意:很多人会认为如果属性具备 nonatomic 特质,则不使用
1159-
“同步锁”。其实在属性设置方法中使用的是互斥锁(atomic 的底层实现,老版本是自旋锁,iOS10开始是互斥锁--spinlock底层实现改变了。),互斥锁(atomic 的底层实现,老版本是自旋锁,iOS10开始是互斥锁--spinlock底层实现改变了。)相关代码如下:
1159+
“同步锁”。其实在属性设置方法中使用的是互斥锁(atomic 的底层实现,老版本是自旋锁,iOS10开始是互斥锁--spinlock底层实现改变了。),相关代码如下:
11601160
11611161
11621162
```Objective-C
@@ -1256,6 +1256,11 @@ void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL ato
12561256
- `readwrite`
12571257
- `strong`
12581258

1259+
1260+
Objective-C 对象默认是 strong,因为你 `class_copyPropertyList` 后再`property_getAttributes` 得到的是`T@"NSString",&,V_name`,其中`&`表示strong(c表示copy等);
1261+
1262+
普通对象是 `assign`,这个获取不到文档说明,但是我们可以从 runtime 源码中找到相关的逻辑,你看看 `objc_AssociationPolicy` 枚举的定义以及内部处理的逻辑就知道了,还有一点就是属性加不加 assign 用 `property_getAttributes` 得到的都是一样的值,可以返推回去结论成立。
1263+
12591264
参考链接:
12601265

12611266
1. [ ***Objective-C ARC: strong vs retain and weak vs assign*** ](http://stackoverflow.com/a/15541801/3395008)
@@ -1669,6 +1674,7 @@ objc在向一个对象发送消息时,runtime库会根据对象的isa指针找
16691674
- 每一个对象内部都有一个isa指针,指向他的类对象,类对象中存放着本对象的
16701675

16711676

1677+
16721678
1. 对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)
16731679
2. 成员变量的列表,
16741680
2. 属性列表,
@@ -1694,6 +1700,8 @@ objc在向一个对象发送消息时,runtime库会根据对象的isa指针找
16941700
- 根对象就是NSObject,它的superclass指针指向nil
16951701

16961702
- 类对象既然称为对象,那它也是一个实例。类对象中也有一个isa指针指向它的元类(meta class),即类对象是元类的实例。元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。
1703+
- 类对象 是放在数据段(数据区)上的, 和全局变量放在一个地方. 这也就是为什么: 同一个类对象的不同实例对象,的isa指针是一样的.
1704+
- 实例对象存放在堆中
16971705

16981706

16991707

0 commit comments

Comments
 (0)