黑马程序员技术交流社区

标题: self [打印本页]

作者: 汪坤洋    时间: 2015-11-10 15:17
标题: self
问题
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到底存在内存哪个区域





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2