---------------------- <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了该类的头文件,而不会包含类的实现文件)
!在类的声明中和实现中不能声明相同名称的成员变量,不能声明和父类相同名称的成员变量(即使该成员变量在父类中是私有的)
作用:编译器在编译时会自动生成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>、期待与您交流! ----------------------