id:万能指针,已经带*
typedef struct objc object{
Class isa;
} *id;
Person *p = [Person new];
NSObject * = [Person new];//id==NSObject *
id d=[Person new];//能操作任何OC对象
[d setAge:10];
@property id obj;//说明obj是任意类型
[d setObj:@"asdfa"];
构造方法:用来初始化对象的方法,是对象方法 -开头
重写构造方法目的:为了让对象创建出来,成员变量就会有一些固定的值
/*注意点:
先调用父类的构造方法([super init])
再进行子类内部成员变量的初始化
*/
Person *p = [Person new];//+ (id)new;
//先分配存储空间+alloc,再初始化-init,初始值是0
Person *p2=[[Person alloc] init];//以后开发都这么写
若想改变init初始化为自定义的值,就要重写- init方法
- (id)init
{
//1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; //返回当前对象,由于涉及到运行时,所以需要再次确定
if (self !=nil)
{//2.初始化成功
_age=10;
}
return self;//3.返回一个已经初始化完毕的对象
}
精简:
- (id)init
{
if(self = [super init])
{
_age=10;
}
return self;
}
自定义构造方法的规范
1.一定是对象方法,一定以 - 开头
2.返回值一般是id类型
3.方法名一般以init开头
- (id)initWithName:(NSString *)name andAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age
{
if(self=[super init])
{
_name=name;
_age=age;
}
return self;
}
Person *p = [[Person alloc] initWithName:@"Rose" andAge:20];
父类属性(成员变量)交给父类去处理,子类属性交给子类自己处理
Student 继承Person 自定义构造方法
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
//由于子类无法改变父类的成员变量,无法使用_name=name;可以用self.name=name;或[self setName:name];代替之。
//另一个好处就是,父类的name值改了,不需要子类再去改。
if(self = [super initWithName:name andAge:age])//一般通过super父类的方法实现我们自定义构造方法初始化指定的值
{
_no=no;
}
return self;
}