我希望将对象添加到NSMutableArray“myArray”,NSMutableArray是FileObj的数组,它具有NSString属性“fileName”
#import <UIKit/UIKit.h>
@interface FileObj : NSObject {
NSString *fileName;
}
-(void) setfileName:(NSString *)s ;
-(NSString *) getfileName ;
@end
//
// File.m//
#import "File.h"
@implementation FileObj
-(void) setfileName:(NSString *)s ;
{
fileName=s;
}
-(NSString *) getfileName ;
{
return fileName;
}
@end
我在这里初始化myArray:
NSMutableArray *temarray;
temarray=[[NSMutableArray alloc] init];
self.myArray=temarray;
[temarray release];
将对象添加到myArray的代码
FileObj *newobj=[[FileObj alloc]init ];
NSString *fieldValue2 = [[NSString alloc] initWithUTF8String:@"aaaa"];
[newobj setfileName:fieldValue2];
[myArray addObject:newobj];
[fieldValue2 release]; //**if I enabled the line, it will cause crash**
//**if I disable the line, it will cause memory leak**
[newobj release];
欢迎任何评论
由于
InterDev中
答案 0 :(得分:1)
首先,您应该了解ObjC命名约定。 ObjC中没有-get方法。使用您自己的2个字母(如NS)为您的课程添加前缀也是一个好主意。
您的setter值赋值无效,并且不需要NSString初始化。 我会强烈向您推荐介绍材料!
@interface MYFileObject : NSObject {
NSString *_fileName;
}
- (void)setFileName:(NSString *)theString;
- (NSString *)fileName;
@end
和实施
@implementation MYFileObject
- (void)setFileName:(NSString *)theString {
[_fileName release];
_fileName = [theString copy];
}
- (NSString *)fileName {
return [[_fileName copy] autorelease];
}
- (void)dealloc {
[_fileName release];
[super dealloc];
}
@end
你会添加这样的对象......
NSMutableArray *myAry = [[NSMutableArray alloc] init];
MYFileObject *obj = [[MYFileObject alloc] init];
[obj setFileName:@"thefilename.txt"];
[myAry addObject:obj];
[obj release];
我建议使用属性而不是定义自己的getter / setter。 您还可以使用NSMutableArrays指定的初始化器来快速创建数组。
在此处查看如何使用属性:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html
答案 1 :(得分:1)
为什么要打扰吸气者和制定者?已使用declared property!
@interface FileObj : NSObject {
NSString *fileName;
}
@property(retain,nonatomic) NSString* fileName; // <---
@end
...
@implementation FileObj
@synthesize fileName; /// <---
-(void)dealloc {
[fileName release]; // Remember to release the object on dealloc.
[super dealloc];
}
@end
...
FileObj *newobj=[[FileObj alloc] init];
NSString *fieldValue2 = [[NSString alloc] initWithUTF8String:@"aaaa"];
newobj.fileName = fieldValue2; /// <----
[myArray addObject:newobj];
[fieldValue2 release];
[newobj release];
答案 2 :(得分:0)
发生崩溃是因为NSString实例不再保留。
一种常见的模式是保留NSString属性,使用@property或手动声明。
您应该像这样修改设置器:
-(void) setfileName:(NSString *)s ;
{
[s retain]; // <- Retain new value
[filename release]; // <- Release old value
fileName=s;
}