Iphone 在LayoutSubView之后释放NSObject
首先,我有一个继承自Iphone 在LayoutSubView之后释放NSObject,iphone,objective-c,ios,cocoa,ipad,Iphone,Objective C,Ios,Cocoa,Ipad,首先,我有一个继承自NSObject @interface Role : NSObject{ /*...*/ } @end 还有一个属性用于存储角色类的即时指针 @property (nonatomic, retain) Role * role; Role * r = [[Role alloc] init]; role = r; [r release]; 现在,当创建ui视图时,我初始化角色类的一个瞬间 @property (nonatomic, retain) Role * role;
NSObject
@interface Role : NSObject{ /*...*/ } @end
还有一个属性用于存储角色
类的即时指针
@property (nonatomic, retain) Role * role;
Role * r = [[Role alloc] init];
role = r;
[r release];
现在,当创建ui视图
时,我初始化角色
类的一个瞬间
@property (nonatomic, retain) Role * role;
Role * r = [[Role alloc] init];
role = r;
[r release];
据我所知,属性角色
标记为retian
,然后当我设置值时,它会自动增加引用计数,当应用程序退出时,属性设置为nil时,它会减少引用计数
一切看起来都很好,但当我运行应用程序时,我发现我将得到EXC\u BAD\u访问异常
我添加了NSLog
,这是因为在UIView
调用layoutSubviews
之后,角色
即时已被释放
,我无法理解为什么会发生这种情况,因为我没有任何代码可以立即释放
目前我的临时解决方案是:我注释掉行[r release]
如果布局子视图
有一些背景我不知道,有人能给我一些解释吗
谢谢您正在直接访问ivar。这应该是:
self.role = r;
避免直接访问IVAR;始终使用访问器,除非在
init
和dealloc
中直接访问ivar。这应该是:
self.role = r;
避免直接访问IVAR;始终使用除
init
和dealloc
之外的访问器您实际上应该调用属性“setter method”来保留值
self.role = r;
或
实际上,您应该调用属性“setter method”来保留该值
self.role = r;
或
为了使物业正常运行,您需要使用它。。。因此,使用self.role=r;为了使物业正常运行,您需要使用它。。。因此,使用self.role=r;