A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 汪坤洋 中级黑马   /  2015-11-10 15:17  /  717 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题
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到底存在内存哪个区域

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马