oc函数中oc new 与 alloc区别的对象什么时候释放

主题 : 关于alloc,init
级别: 侠客
可可豆: 803 CB
威望: 803 点
在线时间: 356(时)
发自: Web Page
来源于&&分类
关于alloc,init&&&
我是个初学者前辈们 我是刚学习oc的    我看好多 关于alloc ,init 这个是什么意识啊比如Class1 *object1=[[Ckass1 alloc] init];  这个不可以直接写 成 Class1 *object1[Class new]; 么,
级别: 光明使者
发帖: 2472
可可豆: 177329 CB
威望: 175105 点
在线时间: 6436(时)
发自: Web Page
这是oc的语法。oc一般用alloc release而不用new,init是对象的初始化。
级别: 侠客
可可豆: 294 CB
威望: 994 点
在线时间: 1112(时)
发自: Web Page
alloc 和 init 分别把分配内存和初始化的工作分开。new 是把分配内存和初始化的工作一起完成了,先分配内存,然后调用类的构造函数。
级别: 侠客
可可豆: 803 CB
威望: 803 点
在线时间: 356(时)
发自: Web Page
回 2楼(jerry.chen) 的帖子
哦谢谢你哦懂什么意识里 但是既然new&&可以一下都做的事情 为什么还分开呀 ,分开 做 有什么好处么
级别: 精灵王
可可豆: 37810 CB
威望: 38806 点
在线时间: 2088(时)
发自: Web Page
内存管理机制问题吧,java开发者不需要考虑内存释放这些问题,所以new就行了。 objective c&&需要自己管理内存。
/能吃能喝能睡
级别: 侠客
可可豆: 803 CB
威望: 803 点
在线时间: 356(时)
发自: Web Page
回 4楼(lw223) 的帖子
哦谢谢 嘿嘿
级别: 侠客
可可豆: 444 CB
威望: 444 点
在线时间: 91(时)
发自: Web Page
学习了 alloc分配内存 init初始化 new一起。。。
级别: 圣骑士
可可豆: 3219 CB
威望: 3279 点
在线时间: 1140(时)
发自: Web Page
建议楼主看看这篇帖子
GIT: /Doraemomo/
级别: 新手上路
可可豆: 395 CB
威望: 395 点
在线时间: 148(时)
发自: Web Page
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
你必须非常努力,才能看起来毫不费力。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
总结如下:& & & & 1、经过@property的属性,在赋值的时候最好带上self.来访问。比如声明为retain的属性a ,只有经过self.a=x;这样才会对x retain一次么,否则不会。在赋值的 时候最好这样写: A * _a = [A alloc]int];& self.a = _a; &_ 2、经过@synthesize的属性,在释放的时候,如果@property的释放的时候要么这样写: self.a = 要么这样写 : [a release];& & & & a =
如果这样写: [self.a release]; a = 或者这样: [self.a &release]; self.a = 或者。。。这样的话编译器不会报错 ,但是运行时就会奔溃,提示 A release 时出问题 ,程序尝试 释放了已经释放的对象。这样写表面上看起来 跟上面没有多大的差别 啊,为什么会 出现这样的问题呢?问题就出在@property和@synthesize这俩关键字上面。==========================================================================================查看文档 可以发现self.a 访问a是get函数,self.a =其实会先释放a原来指向的内存空间,然后将a赋值为nil,就是清空了对应的内存空间。所以self.a=一句话就已经把对象的属性给释放掉了,后面不需要再release了。==========================================================================================另外初始化方法一定要在init后面的第一个字母大写,否则会出现问题,这是苹果的要求。比如:A * _a=[[A alloc]initwithX:(int)_x];self.a = _a;[_a release];这样经过Analyze,编译器会提示最后一句话有问题,这个地方拿不到对象的控制权却 去释放对象,有潜在内存泄露的可能。把w改成W就OK了。这 就是苹果要求的初始化一族的方法,init后面第一个字符必须 大写 。
阅读(925)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Objective-C中属性的正确赋值和释放',
blogAbstract:'& & & & &最近一直比较忙,好久没有写日志了。今晚突来兴趣,写一下最近遇到的一个问题。& & & & &刚开始没有深入理解OC中对象的属性,没有理解声明@property和合成@synthesize的属性与普通的属性有什么本质的区别,怎么正确地释放它们,导致在写程序中程序总是时不时 奔溃 ,走了一些弯路。\t总结如下:& & & & 1、经过@property的属性,在赋值的时候最好带上self.来访问。比如声明为retain的属性a ,只有经过self.a=x;这样才会对x retain一次么,否则不会。在赋值的 时候最好这样写:',
blogTag:'ios,属性的释放,内存管理,@peoperty,@synthesize',
blogUrl:'blog/static/1',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:3,
permalink:'blog/static/1',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'你必须非常努力,才能看起来毫不费力。',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}[Objective-]OC中NSNumber数字对象的常用处理方法
之前已经学习过了基本数据类型。但是这些都市基本数据类型,它们不是对象。因此,不能向它们发送消息。
然后有时也需要将它们当做对象来处理。不如,我们需要把基本数据类型放入到集合中(在Cocoa中集中只能存放对象,
无法存放基本数据类型),那么这时我们需要将基本类型转换成数字对象.OC中提供了数据对象&NSNumber&可以将基本数据
类型&包装&成对象,这样我们就可以将基本数据类型来处理了
下面我们来看下具体使用例子:
FoundationDemo1
Created by hmjiangqq on 14-1-23.
Copyright (c) 2014年 hmjiangqq. All rights reserved.
int main(int argc, const char * argv[])
@autoreleasepool {
// insert code here...
NSLog(@&Hello, World!&);
/*===========NSNumber=================*/
//创建一个NSNumber对象
NSNumber *monthNumber=[[NSNumber alloc]initWithInt:10];
NSNumber *lengthNumber=[[NSNumber alloc]initWithFloat:10.8];
NSLog(@&month =%@\n&,monthNumber);
NSLog(@&length =%@\n&,lengthNumber);
//还原成基本数据类型
int month=[monthNumber intValue];
float length=[lengthNumber floatValue];
NSLog(@&month=%d\n&,month);
NSLog(@&length=%.1f\n&,length);
/*=============NSString====================*/
上面只是使用到了NSNumber中的两个包装和还原的方法,在NSNumber中还有很多相类似的方法:
- (id)initWithChar:(char)
- (id)initWithUnsignedChar:(unsigned char)
- (id)initWithShort:(short)
- (id)initWithUnsignedShort:(unsigned short)
- (id)initWithInt:(int)
- (id)initWithUnsignedInt:(unsigned int)
- (id)initWithLong:(long)
- (id)initWithUnsignedLong:(unsigned long)
- (id)initWithLongLong:(long long)
- (id)initWithUnsignedLongLong:(unsigned long long)
- (id)initWithFloat:(float)
- (id)initWithDouble:(double)
- (id)initWithBool:(BOOL)
- (id)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
- (id)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
与之相反的方法如下:
- (char)charV
- (unsigned char)unsignedCharV
- (short)shortV
- (unsigned short)unsignedShortV
- (int)intV
- (unsigned int)unsignedIntV
- (long)longV
- (unsigned long)unsignedLongV
- (long long)longLongV
- (unsigned long long)unsignedLongLongV
- (float)floatV
- (double)doubleV
- (BOOL)boolV
- (NSInteger)integerValue NS_AVAILABLE(10_5, 2_0);
- (NSUInteger)unsignedIntegerValue NS_AVAILABLE(10_5, 2_0);
当然我们还可以使用NSNumber的静态方法进行创建对象,方法如下:
+ (NSNumber *)numberWithChar:(char)
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)
+ (NSNumber *)numberWithShort:(short)
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)
+ (NSNumber *)numberWithInt:(int)
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)
+ (NSNumber *)numberWithLong:(long)
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)
+ (NSNumber *)numberWithLongLong:(long long)
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)
+ (NSNumber *)numberWithFloat:(float)
+ (NSNumber *)numberWithDouble:(double)
+ (NSNumber *)numberWithBool:(BOOL)
+ (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);关于OC中的alloc&init方法
alloc方法是继承自NSObject,对于NSObject中该方法的实现,是苹果公司封装,我们无法看到。该方法是申请了一块内存。
对于 Class * aclass = [[Class
alloc]init];这种创建对象的方法,都说是推荐的方法。并且,如果分开成这样:
Class * aclass = [Class alloc];
aclass = [aclass init];
通过NSLog打印地址,下面这种写法中会明显看出这两行aclass的地址并不一致,为什么呢?因为所有的init方法都会调用super
init,而实际上最终都是调用了NSObject这个类的init方法,通过推理得知,就是NSObject在init方法的实现中就是会返回不同的地址。编译器会自动添加申请对象的一些信息,从方法的直观显示中我们无法看到,但肯定是传递了过去。不然我们无法再initWithXXX方法中给对象的实例变量赋值。
而alloc方法,每次都会重新申请一块内存,当然对于某些系统类是不一定的(如NSString类赋值常量字符串的,或者初始化为长两字符串的时候,系统的编译器做了特殊化处理,实际上改变了alloc方法,或者说并没有使用alloc方法,编译器在这里做了一些改进和区分)。alloc的意思是申请了一块对象的内存,并且retaincount+1,这也就是黄金法则中说的有alloc,那必然要使用realease。只有有了这个alloc的对象,才能使用init方法。
但为什么使用了alloc还要使用init方法呢?只能这么说明,就是alloc出来的这个对象是不能直接使用的,这块内存中的很多的数据并没有清零,直接使用就怕出来问题。所以要init。
alloc和init可以看做是是这样的,alloc可以看做是做了一个初稿,init按照这个初稿完成了一个可以使用的产品(对象)。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。鍙?渶涓

我要回帖

更多关于 oc alloc init 的文章

 

随机推荐