问题
self的作用域
main函数
#import <Foundation/Foundation.h>
#import "A.h"
#import "B.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
A *aa = [A new];
A *bb = [A new];
B *aa1 = [B new];
B *bb1 = [B new];
[aa show];
NSLog(@"aa----p---%p",&aa);
NSLog(@"aa----@---%@",aa);
NSLog(@"aa----self---%p",[aa self]);
[A aaa];
[bb show];
NSLog(@"bb----p---%p",&bb);
NSLog(@"bb----@---%@",bb);
NSLog(@"aa----self---%p",[bb self]);
[A aaa];
[aa1 show];
NSLog(@"aa1----p---%p",&aa1);
NSLog(@"aa1----@---%@",aa1);
NSLog(@"aa----self---%p",[aa1 self]);
[B aaa];
[bb show];
NSLog(@"bb1----p---%p",&bb1);
NSLog(@"bb1----@---%@",bb1);
NSLog(@"aa----self---%p",[bb1 self]);
/*
结论
1、在一个程序中 不管是一个类的不同对象 还是不同的类 self的地址都不会改变 改变的只是指向的值
2、在arc模式下,不能对self重新赋值
3、在mrc模式下,对self赋值之后,在重新发消息前有效,当对象重新发送消息时,会重新让self指向新的对象
*/
}
return 0;
}
A.m
@implementation A
-(void)show{
NSLog(@"对象方法--A--p--%p",&self);
NSLog(@"对象方法-A-@--%@",self);
}
+(void)aaa{
NSLog(@"类方法-A--p-%p",&self);
NSLog(@"对象方法-A-@--%@",self);
}
@end
打印结果
2015-11-09 10:31:42.772 oc1109[827:37813] 对象方法--A--p--0x7fff5fbff7e8
2015-11-09 10:31:42.773 oc1109[827:37813] 对象方法-A-@--<A: 0x100113cd0>
2015-11-09 10:31:42.773 oc1109[827:37813] aa----p---0x7fff5fbff828
2015-11-09 10:31:42.773 oc1109[827:37813] aa----@---<A: 0x100113cd0>
2015-11-09 10:31:42.773 oc1109[827:37813] 类方法-A--p-0x7fff5fbff7e8
2015-11-09 10:31:42.773 oc1109[827:37813] 对象方法-A-@--A
2015-11-09 10:31:42.774 oc1109[827:37813] 对象方法--A--p--0x7fff5fbff7e8
2015-11-09 10:31:42.774 oc1109[827:37813] 对象方法-A-@--<A: 0x100114960>
2015-11-09 10:31:42.774 oc1109[827:37813] bb----p---0x7fff5fbff820
2015-11-09 10:31:42.774 oc1109[827:37813] bb----@---<A: 0x100114960>
2015-11-09 10:31:42.774 oc1109[827:37813] 类方法-A--p-0x7fff5fbff7e8
2015-11-09 10:31:42.774 oc1109[827:37813] 对象方法-A-@--A
2015-11-09 10:31:42.774 oc1109[827:37813] 对象方法--B--p--0x7fff5fbff7e8
2015-11-09 10:31:42.774 oc1109[827:37813] 对象方法-B-@--<B: 0x100114a90>
2015-11-09 10:31:42.774 oc1109[827:37813] aa1----p---0x7fff5fbff818
2015-11-09 10:31:42.774 oc1109[827:37813] aa1----@---<B: 0x100114a90>
2015-11-09 10:31:42.774 oc1109[827:37813] 类方法-B--p-0x7fff5fbff7e8
2015-11-09 10:31:42.775 oc1109[827:37813] 对象方法-B-@--B
2015-11-09 10:31:42.775 oc1109[827:37813] 对象方法--A--p--0x7fff5fbff7e8
2015-11-09 10:31:42.775 oc1109[827:37813] 对象方法-A-@--<A: 0x100114960>
2015-11-09 10:31:42.775 oc1109[827:37813] bb1----p---0x7fff5fbff810
2015-11-09 10:31:42.775 oc1109[827:37813] bb1----@---<B: 0x100114ae0>
Program ended with exit code: 0
结论
1、在一个程序中 不管是一个类的不同对象 还是不同的类 self的地址都不会改变 改变的只是指向的值(记住self 是个指针)
2、在arc模式下,不能对self重新赋值
3、在mrc模式下,对self赋值之后,在重新发消息前有效,当对象重新发送消息时,会重新让self指向新的对象
引发的其他问题
在不同程序中的self地址不同 self地址是不是程序运行时创建的,self到底存在内存哪个区域
|
|