4、OC —— 构造方法
程序员文章站
2024-01-14 22:47:22
...
1、回顾之前写的 Person 类的 set 和 get 方法
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject {
int _age; // 年龄
int _height; // 身高
}
- (void)setAge:(int)age;
- (int)age;
- (void)setHeight:(int)height;
- (int)height;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)setAge:(int)age {
_age = age;
}
- (int)age {
return _age;
}
- (void)setHeight:(int)height {
_height = height;
}
- (int)height {
return _height;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 调用了init构造方法,alloc是由类名直接调用,所以是静态方法,而init则是动态方法
Person *person = [[Person alloc] init];
person.age = 20;
person.height = 150;
}
return 0;
}
2、现在我们自己来写一个构造方法,来实现初始化的时候 Person 类的两个私有变量可以被赋值
Person.h
@interface Person : NSObject {
int _age; // 年龄
int _height; // 身高
}
// ...
// 自己写的构造方法,是一个动态方法
- (id)initWithAge:(int)age andHeight:(int)height;
@end
Person.m
@implementation Person
// ..
// 实现自己写的构造方法
- (id)initWithAge:(int)age andHeight:(int)height {
// 跟 java 一样先从父类那初始化
self = [super init];
// 如果初始化成功不为空
if (self != nil) {
_age = age; // 或者 self.age = age;
_no = no; // 或者 self.no = no;
}
// 上面的代码可简写成以下,先赋值,再判断是否为空
// if (self = [super init]) {
// ...
// }
// 最后要返回一个已初始化的对象
return self;
}
@end
main.m
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Person *person = [[Person alloc] init];
// person.age = 20;
// person.height = 150;
Person *person = [[Person alloc] initWithAge:20 andHeight:150];
NSLog("age=%i,height=%i", person.age, person.height);
}
return 0;
}
3、 %@代表打印一个对象
main.m
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
NSLog(@"%@", person); // 输出:person的地址
}
return 0;
}
可以重写类自带的description方法来打印输出,因为它默认就是输出类的地址
Person.m
@implementation Person
// ..
// 重写description方法
- (NSString *)description {
return @"This is Person Class";
}
@end
这时再使用 NSLog 输出这个类就会输出以上的字符串了。
4、补充
a)self 在动态方法中代表调用这个方法的对象(谁调用这方法,谁就是self);在静态方法中它代表这个类;
b)写在 .h 文件中的变量默认是 @protected,即可以自己和子类访问,若想设置为 @public 或 @private 可这样设置
@interface Person : NSObject {
int _age;
@public
int _height;
@private
int _width;
}
@end
c)没写在 .h 文件中的方法属于私有方法,写了的则为公有方法;
转载于:https://my.oschina.net/cobish/blog/339263
下一篇: OC 内存管理-02 ARC 内存管理