黑马程序员-iOS学习日记(六)面向对象-核心语法(一)

---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、<a href="http://www.itheima.com"target="blank">iOS培训</a>、期待与您交流! ----------------------


一、点语法

点语法的作用是简化对象调用setter方法和getter方法。

点语法的本质还是方法的调用,当使用点语法时编译器会自动展开成相应的方法。

@interface Person : NSObject
{
    NSString *_name;
}

- (void)setName:(NSString *)name;
- (NSString *)name;
@end

@implementation Person
- (void)setName:(NSString *)name
{
    _name = name;   // 不能使用 self.name = name; 会造成死循环
}
- (NSString *)name
{
    return _name;   // 不能使用 return self.name; 会造成死循环
}
@end

int main()
{
    Person *p = [Person new];
    
    p.name = @"WhyRanR";    // 在编译阶段编译器会把该行代码转化为 [p setName:@"WhyRanR"];
    
    NSString *name = p.name;    // 在编译阶段编译器会把该行代码转化为 NSString *name = [p name];
    
    NSLog(@"%@",name);
    
    return 0;
}

二、成员变量的作用域

在类的声明中

@private    // 只能在当前的类的对象方法中直接访问
@protected  // 只能在当前类及其子类的对象方法中直接访问(默认)
@public     // 在任何地方都能访问类的成员变量
@package    // 只要处在同一框架中,就能访问对象的成员变量

在类的实现中

所有在类的实现中定义的成员变量都是私有的(任何修饰符都无效),即@private(因为其他类只import了该类的头文件,而不会包含类的实现文件)

!在类的声明中和实现中不能声明相同名称的成员变量,不能声明和父类相同名称的成员变量(即使该成员变量在父类中是私有的


三、@property和@synthesize

作用:编译器在编译时会自动生成setter和getter方法

@interface Person : NSObject
{
    NSString *_name;
}

@property NSString *name;
/* 
 @property 写在类的声明中:可以自动生成成员变量的setter和getter方法
 
 编译器在编译的时候会自动把上面的语句转换为
 - (void)setName:(NSString *)name;
 - (NSString *)name;
 
 如果没有声明对应的成员变量,编译器会自动帮助生成,成员变量名为 _名称(该示例会生成 NSString *_name;)
 */
@end

@implementation Person
@synthesize name = _name;
/*
 @synthesize 写在类的实现中:可以自动生成成员变量的setter和getter方法,可以省略该标签及其内容(只在类的声明中使用@property而类的实现中的@synthesize可以省略)
 
 编译器在编译的时候会自动把上面的语句转换为
 - (void)setName:(NSString *)name
 {
    _name = name;
 }
 - (NSString *)name
 {
    return _name;
 }
 
 =右边为该类对应的成员变量名称。
 如果没有写 =及右侧的代码(只写 @synthesize name;) 编译器会自动帮助生成成员变量名为名称的成员变量(该示例会生成 NSString *name;)
 */
@end
!如果使用@property和@synthesize而省略了对于成员变量的声明,则自动生成的成员变量为@private私有的。

!如果类的实现中已经存在了对于的setter方法、getter方法,则@property和@synthesize不会覆盖,而是使用自定义的setter方法、getter方法。


四、id

万能指针,可以指向任何类型的OC对象,相当于 NSObject *。

typedef struct objc object{
    Class isa;
} * id;

!注意:id后面不要加*。


五、构造方法

用来初始化对象的方法,是一个对象方法(方法类型为-)。

构造方法的作用是当创建一个对象时,该对象会有一些默认的值。

@implementation Person
// 重写构造方法
- (id)init
{
    // 1、首先调用父类的init方法 初始化父类中的成员变量(一定要在代码的第一行)
    // 2、如果初始化父类成功 再进行子类成员变量的初始化
    if (self = [super init]) {
        _name = @"WhyRanR";
    }
    // 3、返回一个已经初始化完毕的对象
    return self;
}
@end
@interface Person : NSObject
@property NSString *name;
@property int age;
@end

@implementation Person
/*
 自定义构造方法
 1、一定是对象方法,以-开头
 2、方法返回值一般是id类型
 3、方法名一般以init开头
 */
- (id)initWithName:(NSString *)name andAge:(int)age
{
    if (self = [super init]) {    // 父类的变量交给父类去初始化,子类只初始化自己的成员变量
        self.name = name;
        self.age = age;
    }
    return self;
}
@end

int main()
{
    Person *p = [[Person alloc] initWithName:@"WhyRanr" andAge:27];
    NSLog(@"我叫%@,今年%d岁", p.name, p.age);    // 打印:我叫WhyRanR,今年27岁
    
    return 0;
}


---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、<a href="http://www.itheima.com"target="blank">iOS培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值