类的声明和对象的创建
2015-12-31 14:16
393 查看
一,类和对象。(定义一个类,类的首字母大写)
1,
类属性的声明和类行为的实现:
(1)类的声明是在.h的头文件里,写在@interface
和@end之间。
@inerface
//此处写声明
(1)声明整形。
@property
(nonamotic)
int age;
(2)声明字符串
NSSring
@property
(nonamaotic
, copy)NSSring *name;
//行为(方法)的声明
@end
主意:属性声明的四个关键字retain assign copy readonly。
retain 如果属性是对象(引用数据类型),就用这关键字,他会做了两件事
(1)把原来的值内存计数-1
(2)把新的内存计数+1并赋值
跟关键字strong有同样的作用
例如一个person类里引入一个dog类。
@property
(nonamotic retain)
Dog *MyDog;
assign 是默认的不用写。
直接赋值与
weak一样。他用与基本数据类型,字符串除外,
copy 复制,一些特殊对象类型,如果不希望和别人共享一个对象,或防止别人改动,用copy,他会自动创建一个一模一样的对象
字符串就使用copy。
readonly 只读,去掉setter方法,只有getter方法。
@property声明属时为我们做了三件事,
1,创建一个全局变量。
2,为其创建一个setter方法。
3,为其创建一个getter方法。
声明格式:
(1)声明整形。
@property
(nonatomic)
int age;
(2)声明字符串
NSSring
@property
(nonatomic
, copy)NSSring *name;
nonatomic
非原子性操作,安全性低,效率高。
atomic 原子性操作,在多线程操作的时候,一般是为了防止未写完时,别另一个线程读取,造成安全性的问题,这种操作耗费资源。
2,类行为的实现写在.m文件里面
@implementation
和@end之间。
@implementation
—(void)行为名{
}
@end
二,对象的使用和创建和初始化
创建的格式
类名 *对象名=[[类名
alloc]init];
给对象赋值
就是给对象的属性赋值。
对象名.属性=
三,内存管理
1.内存计数机制:每一个对象都有一个内存计数器
记录当前此对象被引用的次数
如果引用次数为0
系统会自动调用该对象的
dealloc
方法
释放该对象
规则:谁加的谁负责减掉
retain/strong:会让set方法中做两件事
把原来的对象内存计数-1
把新的对象内存计数+1
assign/weak:set方法中只做一件事
赋值
没有涉及内存管理
修饰基本数据类型
copy:set方法中
做了复制的操作
创建了一个新的对象(计数为1)
和之前的对象就没有关系了
readOnly:只读
去掉了set方法
retain方法:会让内存计数+1
release方法:让内存计数-1
如何验证一个对象是否被释放掉
去对象类中添加dealloc
方法
在此方法中nslog看是否执行
当一个对象被释放掉,系统会自动调用dealloc方法。
2,
自动释放池:为了提高开发效率
创建对象的时候可以在对象后面加上一个autorelease
当对象出了自动释放池的时候会
自动执行该对象的release方法
让内存计数-1.
自动释放池语句@autoreleasepool { }。
3,工厂方法:工厂方法通常都实现了自动发送autorelease的消息,
用工厂方法创建的对象不需要手动管理内存。
4.初始化方法:对象通过alloc方法创建出来之后
必须要进行初始化init,也可以自己定义带参数的初始化方法如:initWithFrame、initWithName、initWith。。。。
-(instancetype)initWithcolor:(NSString *)color andwight:(float) weight andage:(int) age;
当前所处的类是什么就匹配什么,
-(id)initWithcolor:(NSString *)color andwight:(float) weight andage:(int) age;
id表示任意类,
-(id)initWithcolor:(NSString *)color andwight:(float) weight
andage:(int) age;
在.m文件所写
-(id)initWithcolor:(NSString *)color andwight:(float)weight
andage:(int)age {
//调用父类的初始化方法,必须要写的。
self
= [super
init];
//判断创建对象是否成功。
if
(self) {
self.color = color;
self.weight = weight;
self.age = age;
}
return
self;
}
在所运行的地方
dog *dg =[[dog alloc]initWithcolor:@"yellow"
andwight:78.2 andage:10] ;
内存管理的注意点
1,当一个对象赋值给全局变量时
为了保证此对象在使用的过程中不被系统自动释放 需要咱们自己加一个retain
使用起来更踏实。
2,当访问一个从来没有赋过值的变量的时候
变量值是nil
不会出错 。当访问一个赋过值但是被释放过的对象时
变量值(地址)是有的
但是此值(地址)指向的对象已经不存在了 这时候就会崩掉
1,
类属性的声明和类行为的实现:
(1)类的声明是在.h的头文件里,写在@interface
和@end之间。
@inerface
//此处写声明
(1)声明整形。
@property
(nonamotic)
int age;
(2)声明字符串
NSSring
@property
(nonamaotic
, copy)NSSring *name;
//行为(方法)的声明
@end
主意:属性声明的四个关键字retain assign copy readonly。
retain 如果属性是对象(引用数据类型),就用这关键字,他会做了两件事
(1)把原来的值内存计数-1
(2)把新的内存计数+1并赋值
跟关键字strong有同样的作用
例如一个person类里引入一个dog类。
@property
(nonamotic retain)
Dog *MyDog;
assign 是默认的不用写。
直接赋值与
weak一样。他用与基本数据类型,字符串除外,
copy 复制,一些特殊对象类型,如果不希望和别人共享一个对象,或防止别人改动,用copy,他会自动创建一个一模一样的对象
字符串就使用copy。
readonly 只读,去掉setter方法,只有getter方法。
@property声明属时为我们做了三件事,
1,创建一个全局变量。
2,为其创建一个setter方法。
3,为其创建一个getter方法。
声明格式:
(1)声明整形。
@property
(nonatomic)
int age;
(2)声明字符串
NSSring
@property
(nonatomic
, copy)NSSring *name;
nonatomic
非原子性操作,安全性低,效率高。
atomic 原子性操作,在多线程操作的时候,一般是为了防止未写完时,别另一个线程读取,造成安全性的问题,这种操作耗费资源。
2,类行为的实现写在.m文件里面
@implementation
和@end之间。
@implementation
—(void)行为名{
}
@end
二,对象的使用和创建和初始化
创建的格式
类名 *对象名=[[类名
alloc]init];
给对象赋值
就是给对象的属性赋值。
对象名.属性=
三,内存管理
1.内存计数机制:每一个对象都有一个内存计数器
记录当前此对象被引用的次数
如果引用次数为0
系统会自动调用该对象的
dealloc
方法
释放该对象
规则:谁加的谁负责减掉
retain/strong:会让set方法中做两件事
把原来的对象内存计数-1
把新的对象内存计数+1
assign/weak:set方法中只做一件事
赋值
没有涉及内存管理
修饰基本数据类型
copy:set方法中
做了复制的操作
创建了一个新的对象(计数为1)
和之前的对象就没有关系了
readOnly:只读
去掉了set方法
retain方法:会让内存计数+1
release方法:让内存计数-1
如何验证一个对象是否被释放掉
去对象类中添加dealloc
方法
在此方法中nslog看是否执行
当一个对象被释放掉,系统会自动调用dealloc方法。
2,
自动释放池:为了提高开发效率
创建对象的时候可以在对象后面加上一个autorelease
当对象出了自动释放池的时候会
自动执行该对象的release方法
让内存计数-1.
自动释放池语句@autoreleasepool { }。
3,工厂方法:工厂方法通常都实现了自动发送autorelease的消息,
用工厂方法创建的对象不需要手动管理内存。
4.初始化方法:对象通过alloc方法创建出来之后
必须要进行初始化init,也可以自己定义带参数的初始化方法如:initWithFrame、initWithName、initWith。。。。
-(instancetype)initWithcolor:(NSString *)color andwight:(float) weight andage:(int) age;
当前所处的类是什么就匹配什么,
-(id)initWithcolor:(NSString *)color andwight:(float) weight andage:(int) age;
id表示任意类,
在.h文件声明中所写
-(id)initWithcolor:(NSString *)color andwight:(float) weight
andage:(int) age;
在.m文件所写
-(id)initWithcolor:(NSString *)color andwight:(float)weight
andage:(int)age {
//调用父类的初始化方法,必须要写的。
self
= [super
init];
//判断创建对象是否成功。
if
(self) {
self.color = color;
self.weight = weight;
self.age = age;
}
return
self;
}
在所运行的地方
dog *dg =[[dog alloc]initWithcolor:@"yellow"
andwight:78.2 andage:10] ;
内存管理的注意点
1,当一个对象赋值给全局变量时
为了保证此对象在使用的过程中不被系统自动释放 需要咱们自己加一个retain
使用起来更踏实。
2,当访问一个从来没有赋过值的变量的时候
变量值是nil
不会出错 。当访问一个赋过值但是被释放过的对象时
变量值(地址)是有的
但是此值(地址)指向的对象已经不存在了 这时候就会崩掉
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器