ObjectC语言基础4—ARC、成员变量、构造方法、property


一、ARC

1、 在对象属性里只要是对象@property (nonatomic, retain) Object *object,在dealloc方法中就必须调用[_object release]方法。

2、ARC是一种编译器特性,当发现属性是retain的时候,会自动在dealloc中生成release方法。在每次创建对象的时候alloc,new,copy,也不需要release了,ARC会自动生成。

3、ARC在重写dealloc的时候不允许调用super的dealloc。整个项目是ARC是,编译器不允许我门调用release。

4、ARC原理,ARC判断准则,只要没有强指针指向对象,就会释放对象。默认情况下所有的指针都是强指针,__strong。弱指针,ARC会在弱指针指向对象不存在,会把弱指针清空。

5、在ARC中再给Property设置参数的时候,不能用retain,而应该用strong和weak,并且可以用assign基本数据类型。

6、-fno-objc-arc不允许某个文件使用ARC

[java]  view plai
  1. //在ARC中,没有强指针指向的对象,对象就会释放,下面的写法,生成对象后就会释放,没有意义。
  2. __weak Person *p = [[Person alloc]init];
  3. Person *p = [[Person alloc] init];
  4. p = NIL;//当没有强指针指向对象的时候,对象就自动释放,p在这一行释放。

view p

二、点语法

1、点语法属于编译器特性,点语法实际上还是访问get方法还是set方法,不是访问对象的属性。在写getset方法是不要适中self.age = age进行赋值,会引发死循环,要直接访问成员变量_age。同时p->也是可以访问成员变量的,不属于方法调用,又明显区别,需记住。OC数据单继承。


三、成员变量的四种作用域和使用注意

1、成员变量的四种作用域

> @private只能在当前类的@implementation实现类里面直接通过变量名访问。注意点,虽然私有成员变量不可以再子类中访问,但子类还是拥有这个成员变量。那既然拥有,其实还是可以访问的,通过get和set方法,只要父类中实现了get和set方法,子类既可以继承这些方法,访问成员变量,方法在书写时要注意使用self来赋值,提高其扩展性。通过变量名(_age)直接访问,和通过get、set方法直接访问时有区别的,子类实现了这个成员变量的get和set方法self.setAge既可以访问。

> @public任何地方都可以访问。特别注意,成员变量属于对象,没有对象如何访问,在main函数里可以访问也是通过对象来访问,不可能直接_age。

> @protected 可以在当前类及其子类的@implementation中访问。默认值时portected。

> @package同一个”体系“框架内可以访问,介于public 和private中间

2、成员变量可以卸载实现@implementation里面,默认为私有。在@implementation后的大括号里面写成员变量{}



[java]  view plai
  1. @interface Person:NSObject
  2. {
  3. @ public int _age;  //成员变量默认是私有的
  4. NString *_str;//使用注意,这个成员变量会根据上面的那个也成为pulic范围。
  5. }
  6. - (void)setAge:(int)age
  7. - (int)age;
  8. @end
  9. @implementation Person
  10.  {// 这里说明了没有interface一样可以实现一个类。
  11. int height;//在这里写的成员变量为私有。子类和其他文件都访问不到,没人会包含实现文件。不可以和头文件的成员名相同。
  12. }
  13. - (void)setAge:(int)age{
  14. _age = age;//默认情况下,在实现文件中可以访问下划线成员变量。
  15. }
  16. @end


三、Property和synthesize

1、Property作用是帮助我门自动生成get和set方法的声明和实现,同时还可以生成一下滑下开头的成员变量,自动生成的为@pirvate,属于编译器特性。@synthesize自动生成get和set方法的实现,以过时。

2、使用细节,使用的时候,成员变量、get和set方法,有则不自动生成,没有则生成。注意但如果同时实现了get和set方法,就不会生成下滑下的成员变量。

[java]  view plai
  1. //.h
  2. @property int age;既可以生成get和set方法的生命和实现,又可以生成成员变量。
  3. //.m
  4. //@synthesize age=_age;//自动生成get和set方法的实现,已经过时,可以不写。


三、构造方法

1、完整的创建一个可用对象,分两步。分配存储空间,初始化。new放法内部会调用两个方法alloc,init。init就是构造方法。

2、父类方法的初始化交给父类去初始化,子类负责对自己成员变量的初始化。


[java]  view plai
  1. //这个事重写父类的构造方法
  2. -(id)init{
  3. if(self = [super init]){//super init的目的是初始化父类的成员变量,会最先初始化父类的方法。相当于一个递归。
  4. _age = 10;
  5. self.no = 11;//no继承字父类,不可以直接使用只能使用setget方法。或者调用父类的初始化方法初始化父类内容superinit
  6. }
  7. return self;
  8. }
  9. // 在开发过程中一般自定义构造方法,传递参数进行封装。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取Student类的所有构造方法、成员方法和成员变量,可以使用Java的反射机制。下面是示例代码: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { Class<Student> studentClass = Student.class; // 获取所有构造方法 Constructor<?>[] constructors = studentClass.getConstructors(); System.out.println("Constructors:"); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } // 获取所有成员方法 Method[] methods = studentClass.getMethods(); System.out.println("\nMethods:"); for (Method method : methods) { System.out.println(method); } // 获取所有成员变量 Field[] fields = studentClass.getDeclaredFields(); System.out.println("\nFields:"); for (Field field : fields) { System.out.println(field); } } } class Student { private String name; private int age; private int classId; private String sex; private int score; public Student(String name, int age, int classId, String sex, int score) { this.name = name; this.age = age; this.classId = classId; this.sex = sex; this.score = score; } public String getName() { return name; } public int getAge() { return age; } public int getClassId() { return classId; } public String getSex() { return sex; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } } ``` 输出结果: ``` Constructors: public Student(java.lang.String,int,int,java.lang.String,int) Methods: public int Student.getAge() public void Student.setScore(int) public int Student.getClassId() public int Student.getScore() public java.lang.String Student.getSex() public java.lang.String Student.getName() public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException ... Fields: private java.lang.String Student.name private int Student.age private int Student.classId private java.lang.String Student.sex private int Student.score ``` 注意:这里的示例代码使用了`Student`类来表示学生,你可以根据实际情况进行调整。`getConstructors()`方法获取的是所有公共构造方法,`getMethods()`方法获取的是所有公共成员方法,`getDeclaredFields()`方法获取的是所有成员变量(包括私有成员变量)。如果需要获取非公共的构造方法、方法或变量,可以使用相应的方法,如`getDeclaredConstructors()`、`getDeclaredMethods()`和`getDeclaredFields()`。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值