1、回顾之前写的 Person 类的 set 和 get 方法
Person.h
#import@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#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 文件中的方法属于私有方法,写了的则为公有方法;