iOS创建对象 实例方法 类方法

本文介绍了iOS中创建对象的过程,包括使用alloc和init的方法。此外,详细阐述了实例方法和类方法的区别。接着,讨论了属性的概念,指出属性并不创建新的实例变量,而是提供存取方法的快捷方式。@property和@synthesize的关系以及在不同版本的Xcode中的变化也进行了说明。最后,提到了动态属性(@dynamic)的使用场景和内存管理的相关知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 创建对象

Objective-C创建对象需通过alloc以及init两个消息。alloc的作用就是分配内存,init则是初始化对象。init和alloc都是定义在NSObject里的方法,父对象收到这两个消息并做出正确回应后,新对象才创建完毕。

MyObject *my = [[MyObject alloc]init];
        
//Objective-C 2.0中,若创建对象不需要参数,则可以直接使用new
MyObject *my = [MyObject new];
  1. 实例方法和类方法
@interface MyObject : NSObject{
    int memberVar1;//实体变量
    int memberVar2;
}

+ (NSString*) class_method;//类方法

- (void) instance_method1;//实例方法
- (void) instance_method2:(int)p1;
- (void) instance_method3:(int)p1 anPar:(int)p2;

@end

//方法前面的 +/- 号代表函数的类型:加号(+)代表类方法(class method),不需要实例就可以调用,与C++ 的静态函数(static member function)相似。减号(-)即是一般的实例方法(instance method)

/*
 对象方法
 1> 减号 - 开头
 2> 只能由对象来调用
 3> 对象方法中能访问当前对象的成员变量(实例变量)
 
 类方法
 1> 加号 + 开头
 2> 只能由类(名)来调用
 3> 类方法中不能访问成员变量(实例变量)
 
 
 类方法的好处和使用场合
 1> 不依赖于对象,执行效率高
 2> 能用类方法,尽量用类方法
 3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法
 
 可以允许类方法和对象方法同名
*/

> 1.实例方法里面的self,是对象的首地址
> 2.类方法里面的self,是class

  1. 属性
    属性是用来代替声明存取方法的便捷方式。属性不会在你的类声明中创建一个新的实例变量。他们仅仅是定义方法访问已有的实例变量的速记方式而已。
    属性的访问方法由@synthesizer关键字来实现,他由属性的声明自动地产生一对访问方法。另外,也可以选择使用@dynamic关键字表明访问方法会由程序员手工提供。

@property声明了一些成员变量的访问方法;
@synthesize则定义了由property声明的方法
对应关系是:
property 声明方法 -->头文件中申明getter和setter方法;
synthesize定义方法 --> m文件中实现getter和setter方法。

@property 和 @synthesize在Xcode4.4以前一直都是配合着使用,在4.4以后,@property得到了增强,一行代码编译器就会自动帮我们生成setter和 getter方法的声明和实现,以及成员变量的声明。同时在.m文件中声明一个和属性名一样并且在最前面带有下划线的成员变量 (private)。

使用@synthesize 只有一个目的,给实例变量起个别名,或者说为同一个变量添加两个名字。
如果要阻止自动合成,记得使用 @dynamic

@property (nonatomic, assign) NSInteger age;

当我们同时重写了setter and getter方式时,系统会报错,原因是找不到_age这个变量
这里写图片描述

解决办法:

> 方案一:在.h的文件中声明这个属性
  
  Person.h
  @interface Person : NSObject {
      NSInteger _age;
  }
  @property NSInteger age;
  @end;
> 方案二:在.m的文件中使用@synthesize

@implementation Person
 @synthesize age = _age;
 //_age是成员变量;age是属性;最后操纵的都是成员变量
 - (void)setAge:(NSInteger)age {
     _age = age;
 }
 - (NSInteger)age {
     return _age;
 }

总结:

  1. @synthesize的作用:是为属性添加一个实例变量名,或者说别名。同时会为该属性生成setter/getter方法。
    禁止@synthesize:如果某属性已经在某处实现了自己的setter/getter,可以使用@dynamic来阻止@synthesize自动生成新的setter/getter覆盖。
    内存管理:@synthesize和ARC无关
    一般情况下无需对属性添加@synthesize,但一些特殊情况仍然需要,如protocol中声明的属性。

tips:参考出处
http://blog.youkuaiyun.com/shuai265/article/details/75024275
https://www.jianshu.com/p/bcf734db475c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值