我正在Objective-C中编写一个方法,它返回一个基于NSMutableArray输入的字符串.我不打算让调用者修改字符串,但也不小心.该方法的当前签名读作:
- (NSMutableString *) generateString:(NSMutableArray *)myArray
Run Code Online (Sandbox Code Playgroud)
该项目目前是一个命令行基础工具,以学习绳索,但这最终将最终在iPhone应用程序中.
我的问题是:
2)当我返回NSMutableString时,我应该使用autorelease吗?如果你建议我返回一个NSString,它如何修改返回它?
3)如果我还想返回一个错误对象来识别是否发生了错误,可能是一个枚举和一个字符串,在这种情况下所有权是如何工作的?该方法不称为alloc,new或copy,所以调用者如何知道?除了上面方法中的字符串之外,我如何返回分配的错误对象?
谢谢!
cocoa memory-management objective-c nsstring nsmutablestring
这是相关代码:
NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];
address = [address stringByAppendingFormat:@"%@", [defaultServer login]];
address = [address stringByAppendingFormat:@"?%@", [params urlEncodedString]];
NSString *response = [[NSString alloc] init];
response = [self getResponseFromWebAddress:address];
[response release];
[address release];
Run Code Online (Sandbox Code Playgroud)
此代码在此处没有错误,但稍后在某些Apple库中会抛出"发送到解除分配的实例的消息"错误.但是,如果我注释掉[address release]它就行了.为什么?我不太了解内存管理,这让我很困惑.
所以,我有两段代码,一段有效,另一段没有.第一部分只是一个测试,以确定char指针在从本地分配返回后是否仍然有效.出于某种原因,这有效:
char* test(){
char* rawr="what";
return rawr;
}
Run Code Online (Sandbox Code Playgroud)
但是这个不起作用:
char* folderfromfile(char* filz) //gets the folder path from the file path
{
//declarations
int lastslash=-1;
int i =0;
char rett[256];
for(i;(int)filz[i]!=0;i++)
if(filz[i]=='\\')
lastslash=i; //records the last known backslash
if(lastslash==-1)
return ""; //didn't find a backslash
for(i=0;i<=lastslash;i++)
rett[i]=filz[i]; // copies to new string
rett[i] =0; //end of string
cout << &rett << "====" << rett << endl;
system("pause>nul");//pause so i can watch over the memory before it deallocates
return rett;
}
Run Code Online (Sandbox Code Playgroud)
我敢打赌,有一种更好的方法来完成从完整路径中删除文件名的任务,但是现在我只想弄清楚为什么这个char指针被删除而另一个没有删除.如果我不得不猜测我会说它因为我宣布它不同,或者因为它更大.是的,我可以传递另一个char指针作为此函数的参数,但这不会回答我的问题.
此文件是GoAhead WebServer的一部分,它实现了非常快速的块分配方案.
在第284行,Web服务器进程在随机时间崩溃.
} else if ((bp = bQhead[q]) != NULL) {
/*
* Take first block off the relevant q if non-empty
*/
bQhead[q] = bp->u.next; //MEMORY ACCESS VIOLATION HERE
Run Code Online (Sandbox Code Playgroud)
这有什么可能的原因?
EDIT
bp是此头文件中指向此结构和联合的指针
typedef struct {
union {
void *next; /* Pointer to next in q */
int size; /* Actual requested size */
} u;
int flags; /* Per block allocation flags */
} bType;
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想在警报中声明要使用的NSString对象,但其实际内容取决于由某个变量确定的各种因素.我想知道如何最好地解决这个问题.在大多数情况下,我做过这样的事情:
- (void)info {
NSString *targetString = [[NSString alloc] init];
switch (self.target) {
case 1:
targetString = @"ONE";
break;
case 2:
targetString = @"TWO";
break;
case 3:
targetString = @"THREE";
break;
default:
targetString = @"";
break;
}
NSString *message = [[NSString alloc] initWithFormat:@"Text: %@", targetString];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Info"
message:message
delegate:self
cancelButtonTitle:@"Ok!"
otherButtonTitles:nil];
alert.tag = kInfoAlert;
[alert show];
[alert release];
[targetString release];
[message release];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我通过构建分析器运行时,我收到消息告诉我字符串泄漏内存:
首先它说:
永远不会读取在初始化期间存储到'targetString'的值
然后:
在第137行分配并存储到'targetString'中的对象的潜在泄漏
这两条评论位于第136和137行,其中第136行是
NSString *targetString = [[NSString alloc] init];
另一种方法是将字符串声明为 …
当我们声明一个类的对象是它的内存布局是连续的(一个接一个)?如果它的连续性比在它中发生填充(就像结构填充)?请帮我一个类的内存布局的概念
提前致谢.
我坐在这里和下面的课:
class TagCompound : public Tag
{
public:
// [...] Constructor and other methods
void insert(Tag *t);
// [...] more modifying methods
protected:
std::vector<Tag *> _values;
};
TagCompound::insert(Tag *t)
{
_values.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很有趣和花花公子,适用于派生类的堆栈和堆分配对象Tag.
当然,如果提供给的指针TagCompound::insert()是在堆上分配的,那么它必须在外面的某处解除分配.这意味着从向量中删除某些内容的每个方法都必须返回已删除的指针,以便外部可以再次释放它,如果必须的话.
我不喜欢这个,如果调用者忘了它,它会很麻烦并且容易出错delete.
我尝试的另一件事就是假设向量中的每个指针_values都是堆分配的,并且在每个以某种方式删除了某些东西的函数中进行删除,_values并delete在其中的每个剩余元素上运行TagCompound::~TagCompound.
这当然通过导致无效删除完全排除了堆栈指针.
我也试过使用std::auto_ptr但很快我发现它不适用于STL容器.可能有一些来自boost,但我不想使用boost(或任何类型的第三方库).
我是否已经采用其中一种方法正确的方式,或者是否有某种黑魔法效果更好?
好的,抓住了你的头衔.但严肃地说,我无法弄清楚我的代码中泄漏的来源.在仪器中运行它不会显示泄漏,但是当我分析它时它会警告我.这是可疑代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *tableIdentifier = @"Table";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tableIdentifier];
}
NSUInteger row = [indexPath row];
if (cityCount >= 1) {
NSString *city = [NSString stringWithFormat:@"%@, %@, %@",
[[cityData objectAtIndex:row] objectAtIndex:0],
[[cityData objectAtIndex:row] objectAtIndex:1],
[[cityData objectAtIndex:row] objectAtIndex:2]
//,[[cityData objectAtIndex:row] objectAtIndex:3]
];
cell.textLabel.text = city;
cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
return cell;
}
else {
cell.textLabel.text = @"No cities were found";
cell.textLabel.font = [UIFont …Run Code Online (Sandbox Code Playgroud) 大家好我在下面的例子中了解保留的概念有问题.我知道保留的用法......但在这里困惑了..
我有2个类View1和View2
here is method of View1
-(IBAction)callingView2
{
view2 *view=[[view2 alloc] init];
[self.navigationController pushViewController:view animated:YES];
NSString *ss=[[NSString alloc]initWithString:@"Hi friend"];
[view callingToRetain:ss];
[ss release];
[view release];
}
Run Code Online (Sandbox Code Playgroud)
在view2中我有2个方法,str是一个字符串(未分配)
-(void)callingToRetain:(NSString*)s
{
//[s retain]; //it is not effecting my program
str = s;
}
//And then printing it on a button click after reaching to view2
-(IBAction)print
{
NSLog(@"string = %@",str);
}
Run Code Online (Sandbox Code Playgroud)
规则说我应该保留字符串,如果我以后必须使用它,但在这里它的工作没有保留.....
我认为这是str = s;因为它保留了MAX_VALUE,但我不确定......
如果这是问题那么它会影响内存泄漏概念吗?
有什么建议?
假设我有一个包含Records的类TwoWayList,而GetRec实际上在堆上创建了一个新列表,这里是方法
void GetRec(TwoWayList<Record> &rec)
{
TwoWayList<Record>* list= new TwoWayList<Record>();
Record r;
list->Insert(&r);
}
Run Code Online (Sandbox Code Playgroud)
现在我有以下两个场景,第一个在我调用delete时死亡,另一个我只是得到一个空的引用记录,所以当我调用MoveToStart()我得到一个段错误,但是如果我只是删除它工作. ..
int main () {
TwoWayList<Record> record;
GetRec(record);
record.MoveToStart();
delete &record;//crash
return 0;
}
int main () {
TwoWayList<Record> *record;
GetRec(*record);
record->MoveToStart(); //segfault
delete record;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那么最近怎么样?我在方法的堆中创建一个TwoWayList,因此我不能删除(事实上,如果我不删除它不会是泄漏吗?)是什么方法从这里的方法获取TwoWayList以便我以后可以删除吗?
谢谢
丹尼尔
objective-c ×5
c++ ×4
iphone ×4
memory-leaks ×2
nsstring ×2
c ×1
class ×1
cocoa ×1
cocoa-touch ×1
memory ×1
new-operator ×1
retain ×1
scope ×1
static ×1
variables ×1
webserver ×1
xcode ×1