fuz*_*oat 2 memory cocoa objective-c
我是Objective-C的新手,我有点好奇我应该如何管理下面显示的本地NSString变量的内存以及类对象中的相关实例变量.我的代码工作正常,但只是对最佳实践感到好奇.
编辑包含完整的代码,没有什么特别的,就像我说我只是好奇,如果在这个上下文中我应该在NSString对象上进行alloc/release.
// MAIN ------------------------------------------------------------------- **
#import <Foundation/Foundation.h>
#import "PlanetClass.h";
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *planet_01_Geek;
NSString *planet_02_Geek;
// Create planets
PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
[newPlanet_01 setGeekName:@"StarWars"];
PlanetClass *newPlanet_02 = [[PlanetClass alloc] init];
[newPlanet_02 setGeekName:@"Dune"];
// Query a planet
planet_01_Geek = [newPlanet_01 geekName];
planet_02_Geek = [newPlanet_02 geekName];
// Print details
NSLog(@"Planet Geek = %@", planet_01_Geek);
NSLog(@"Planet Geek = %@", planet_02_Geek);
// Clean up
[newPlanet_01 release];
[newPlanet_02 release];
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
..
// CLASS HEADER ----------------------------------------------------------- **
#import <Foundation/Foundation.h>
@interface PlanetClass : NSObject {
NSString *geekName;
}
- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
@end
// ------------------------------------------------------------------------ **
Run Code Online (Sandbox Code Playgroud)
..
// CLASS BODY ------------------------------------------------------------- **
#import "PlanetClass.h"
@implementation PlanetClass
- (NSString*)geekName {
return geekName;
}
- (void)setGeekName:(NSString*)gName {
geekName = gName;
}
@end
// ------------------------------------------------------------------------ **
Run Code Online (Sandbox Code Playgroud)
阅读内存管理规则.9个简单的段落,解释了你需要知道的一切.
因为geekName不以"alloc"或"new"开头或包含"copy",所以它应该返回一个你不"拥有"的字符串.因此,您不需要(实际上也不必)释放它,也不能存储对它的引用.您可以从您所在的方法返回它,在这种情况下,您的方法名称也不应以"alloc"或"new"开头或包含"copy".
如果你想保留它,你必须通过调用retain来获取它的所有权,或者因为它的NSString,更好的是复制.如果将其分配给复制/保留属性,则可能是自动的.
在您现在发布的代码中,您在setter中出错了.你的setter应该带一个输入参数的副本,如:
- (void)setGeekName:(NSString*)gName {
if ( geekName != gName ) {
[geekName release];
geekName = [gName copy];
}
Run Code Online (Sandbox Code Playgroud)
然后你还需要一个释放geekName的dealloc例程:
- (void) dealloc
{
[geekName release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Objective C属性.而不是您的界面显示:
- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
Run Code Online (Sandbox Code Playgroud)
使用属性:
@property (nonatomic, copy) NSString* geekName;
Run Code Online (Sandbox Code Playgroud)
而不是你的setter和getter的实现,让系统为你合成它们:
@synthesize geekName;
Run Code Online (Sandbox Code Playgroud)
你仍然需要dealloc方法来释放geekName.
| 归档时间: |
|
| 查看次数: |
3626 次 |
| 最近记录: |