- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对 Objective-C 中的综合属性有一些疑问。完整列表如下,但基本问题是:编译器如何确保合成属性的 ivars 被正确释放,即使我的代码可能包含也可能不包含在 dealloc 中的释放方法?
注意:我决定不将这些问题作为单独的问题发布,因为它们之间的关系非常密切,并且因为现有的一些问题触及个别问题而没有真正触及问题的核心问题。
有些类似的问题:
设置:考虑一个具有单个属性的类:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
问题 #1: 非常基本的案例:
@implementation Person
@synthesize name;
@end
使用此设置,我假设只要释放 Person
对象,就会自动释放 name
。在我看来,编译器只是将 [name release]
插入到 dealloc
方法中,就好像我自己键入一样。对吗?
问题 #2: 如果我选择为这个类编写自己的 dealloc
方法,并且我省略了对 [name release]
的调用>,会不会漏水?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
问题 #3: 如果我选择为这个类编写自己的 dealloc
方法,并且我包含一个对 的调用[name release]
,这会导致双重发布吗,因为 @synthesize
已经为我处理好了?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
问题 #4: 如果我选择为此类编写自己的属性访问器,但我不编写自己的 dealloc
方法,name
会泄露吗?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
问题 #5:我有一种感觉(根据经验)没有上述情况会导致泄漏或双重发布,因为语言已经旨在避免它们。当然,这提出了“如何?”的问题。编译器是否足够聪明以跟踪所有可能的情况?如果我要执行以下操作(请注意,这是一个荒谬的示例,只是为了说明我的观点):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
这会欺骗编译器向 dealloc
方法添加另一个 [name release]
吗?
最佳答案
第一季度:
没有。 @synthesize
不会为您修改 -dealloc
。你必须自己-release
name
。
第二季度:
是的,它会泄漏。原因与第一季度相同。
第三季度:
不,它不会双重释放。原因与第一季度相同。
第四季度:
是的,它会泄漏。原因与第一季度相同。
Q5:
不,它不会双重释放。原因与第一季度相同。
您可以通过覆盖 -retain
和 -release
和 -dealloc
自行检查以报告发生的情况。
#import <Foundation/Foundation.h>
@interface X : NSObject {}
@end
@implementation X
-(oneway void)release {
NSLog(@"Releasing %p, next count = %d", self, [self retainCount]-1);
[super release];
}
-(id)retain {
NSLog(@"Retaining %p, next count = %d", self, [self retainCount]+1);
return [super retain];
}
-(void)dealloc {
NSLog(@"Dealloc %p", self);
[super dealloc];
}
@end
@interface Y : NSObject {
X* x;
}
@property (nonatomic, retain) X* x;
@end
@implementation Y
@synthesize x;
- (void)dealloc { [x release]; [super dealloc]; }
@end
int main () {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Y* y = [[Y alloc] init];
X* x = [[X alloc] init];
y.x = x;
[y release];
[x release];
[pool drain];
return 0;
}
Q1、Q2、Q4中,x
最后一个-retainCount
为1,所以有泄漏,Q3、Q5最后一个- retainCount
为0,调用了-dealloc
,所以没有泄漏。
关于objective-c - @synthesized 保留属性的释放是如何处理的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2189919/
在 .h 文件中添加了两个属性: @property (assign, nonatomic, readonly) float weightInLbs; @property (strong, nonat
更新到 iOS8.3 后,我开始收到一堆在 iOS8.2 上没有的新警告。其中一个特别引起了我的注意; @property (strong, nonatomic) IBOutlet UITableVi
FINAL EDIT The solution to all life's problems: Switching xcode's "Compiler Version" setting to "LLV
@synthesize 和 @property 在 Xcode 中做什么?请用非常简单的术语进行解释? 最佳答案 您要求简单的术语: @property declares a property in
从 Xcode 4.4 开始具有默认的属性综合。它会自动生成: @synthesize name = _name; source 来自source2 readwrite vs readonly 确
我有几个 UITableViewController,并希望它们都具有多个属性,例如 fetchedResultsController 和 managedObjectContext。所以我为所有这些创
在我的 AppDelegate.h 文件中,我编写了以下代码 @interface iBountyHunterAppDelegate : NSObject { UITabBarControl
我看过下面这段代码: //example.h MKMapView * mapView1; @property (nonatomic, retain) MKMapView * mapView; //ex
我有点困惑,因为在某些教程中只是 在小时 @property (readwrite,nonatomic) NSUInteger DirectProp; 米 @synthesize DirectProp
我正在学习 iPhone 开发。在书中的示例中,属性提到了@synthesize关键字。 对于控件,我在 .h 文件中定义属性,但不在 .m 文件中定义 @synthesize。我正在使用 .text
嗨,我正在尝试了解构造函数在 C++ 中的工作原理。为此,我使用以下示例: class NoDefault { public: NoDefault (const std::string &){}
嗨,我正在尝试了解构造函数在 C++ 中的工作原理。为此,我使用以下示例: class NoDefault { public: NoDefault (const std::string &){}
我正在开发 IOS 应用程序。我确实用 XCode 工具进行了分析,如果我不写自动释放则显示“潜在内存泄漏”消息。这是下面代码块中的错误吗?我不确定。 //TransferList.h @proper
这个问题在这里已经有了答案: What name does the auto-generated ivar take when I just declare a property in XCode
好的,我有我为核心数据创建的类 LoginPass.h 然后我有头等舱 FirstClass.h 然后我需要在 SecondClass 中使用这些类,我在其中使用 @class 声明它们。头文件 Se
我们使用#pragma mark - StackOverFlow Example 来组织我们的功能菜单(实现导航菜单中最内层的菜单)。 我想做的是通过删除不需要的指令(例如 @synthesize)来
我有类似的东西 @property(nonatomic,retain) UIImageView *whiteBfFillUp; @end @synthesize locationManager; 我是
我在最新的 iOS SDK 中使用带有核心数据的示例导航 View 模板。 在 rootViewController.m 文件中,我在 @synthesize 行中看到了这一点: @synthesiz
//SecondPage.h @property (nonatomic, copy) NSString *secondLabelText; +(SecondPage *) newAlloc; +(id
当我第一次学习 iOS 编程时(我相信这是来自斯坦福大学 ARC 之前的讲座),我们总是这样综合属性: @synthesize myProperty=_myProperty 但是,这似乎是 defau
我是一名优秀的程序员,十分优秀!